# Leetcode 133: Clone Graph (已解決) ```cpp= 圖為四邊形 : 1------2 | | 4------3 > adjList = 節點1的鄰居[2,4],節點二的鄰居[1,3],節點三的鄰居[2,4],節點四的鄰居[1,3] ``` ## DFS程式碼 ```cpp= class Solution { public: Node* dfs(Node* cur,unordered_map<Node*,Node*> &mp){ vector<Node*> neighbors; Node* clone = new Node(cur->val); mp[cur]=clone;//將複製好的新節點val 放入map 當作key for(auto it : cur->neighbors){ //在map裡找其鄰居節點 if(mp.find(it)!=mp.end()){ neighbors.push_back(mp[it]);//把cur的鄰居放進去向量裡 } else{ neighbors.push_back(dfs(it,mp)); } } clone->neighbors = neighbors;//把鄰居接上去 return clone; } Node* cloneGraph(Node* node) { unordered_map<Node*,Node*> mp; //用來放(新節點)與(判斷與遍歷鄰居節點) if(node==nullptr) return nullptr; else if(node->neighbors.size()==0){ Node* clone = new Node(node->val); return clone; } return dfs(node,mp); } }; ``` ```cpp= Success Details Runtime: 10 ms, faster than 54.91% of C++ online submissions for Clone Graph. Memory Usage: 9.2 MB, less than 13.28% of C++ online submissions for Clone Graph. ``` ## BFS程式碼 ```cpp= class Solution { public: unordered_map<Node*,Node*> mp; Node* cloneGraph(Node* node) { if(node==nullptr) return nullptr; Node* first = new Node(node->val,{});//複製的第一個新節點,把neighbors去掉,因為之後迴圈會將鄰居放進去 mp[node]=first;//放進map queue<Node*> todo; todo.push(node);//push帶有鄰居的node節點 while(!todo.empty()){ Node* clone = todo.front();//複製queue裡的節點當作新節點 todo.pop(); for(auto neighbor : clone->neighbors){//迭代器 if(mp.find(neighbor)==mp.end()){//判斷map裡是否已經有鄰居節點 mp[neighbor] = new Node(neighbor->val,{}); //若沒有,就新增一個鄰居節點放進map todo.push(neighbor); } mp[clone]->neighbors.push_back(mp[neighbor]);//每次都把新複製節點的鄰居放進去 } } return first;//回傳一開始建立好用來回傳的節點 } }; ``` 結果 : ```cpp! Success Details Runtime: 0 ms, faster than 100.00% of C++ online submissions for Clone Graph. Memory Usage: 8.5 MB, less than 94.59% of C++ online submissions for Clone Graph. ```