方法一:dfs(递归)
map<Node*,Node*> dict; Node* clone(Node* node) { if (!node) return node; if (dict.count(node)) return dict[node]; dict[node]=new Node(node->val,vector<Node*>{}); // 这里不能写clone(node),会导致死循环,记住,在new的时候千万不要再递归,递归最低层一定有一个明确结果,所以要把截止条件写清楚 for(auto it:node->neighbors) dict[node]->neighbors.push_back(clone(it)); return dict[node]; } Node* cloneGraph(Node* node) { return clone(node); }
方法二:dfs(非递归)
map<Node*,Node*> dict; Node* cloneGraph(Node* node) { stack<Node*> S; S.push(node); while (!S.empty()) { Node *p = S.top(); S.pop(); if (!dict.count(p)) // 从栈中出来的都是没有进行访问过的点 dict[p]=new Node(p->val,vector<Node*>{}); for (auto it:p->neighbors) { if (!dict.count(it)) // 判断是否已经访问过该点 { dict[it]=new Node(it->val,vector<Node*>{}); S.push(it); } dict[p]->neighbors.push_back(dict[it]); // 将新点的拷贝放入neighbors中 } } return dict[node]; }