給定無向連通圖的一個節點引用,每個節點含 label 與 neighbors 列表。回傳圖的深拷貝 (新節點、新邊)。
unordered_map cloneMap 。cur,遍歷其 neighbors:
nbr 不在 map,建立複製節點、放入 map、加入容器。cloneMap[nbr] 加入 cloneMap[cur]->neighbors。cloneMap[原起始節點]。/*
// Definition for a Node.
class Node {
public:
int val;
vector neighbors;
Node() { val = 0; }
Node(int _val) { val = _val; }
Node(int _val, vector _neighbors) { val = _val; neighbors = _neighbors; }
};
*/
class Solution {
unordered_map mp;
public:
Node* cloneGraph(Node* node) {
if (!node) return nullptr;
if (mp.count(node)) return mp[node];
Node* copy = new Node(node->val);
mp[node] = copy;
for (Node* nbr : node->neighbors)
copy->neighbors.push_back(cloneGraph(nbr));
return copy;
}
};
class Solution {
public:
Node* cloneGraph(Node* node) {
if (!node) return nullptr;
unordered_map mp;
queue q;
q.push(node);
mp[node] = new Node(node->val);
while (!q.empty()) {
Node* cur = q.front(); q.pop();
for (Node* nbr : cur->neighbors) {
if (!mp.count(nbr)) {
mp[nbr] = new Node(nbr->val);
q.push(nbr);
}
mp[cur]->neighbors.push_back(mp[nbr]);
}
}
return mp[node];
}
};
class Solution {
public:
Node* cloneGraph(Node* node) {
if (!node) return nullptr;
unordered_map mp;
stack st;
st.push(node);
mp[node] = new Node(node->val);
while (!st.empty()) {
Node* cur = st.top(); st.pop();
for (Node* nbr : cur->neighbors) {
if (!mp.count(nbr)) {
mp[nbr] = new Node(nbr->val);
st.push(nbr);
}
mp[cur]->neighbors.push_back(mp[nbr]);
}
}
return mp[node];
}
};
| 版本 | 優點 | 缺點 |
|---|---|---|
| 遞迴 DFS | 代碼最短、邏輯最直觀 | 深圖可能棧溢位 |
| BFS | 無棧溢位、層序擴展 | 隊列額外空間 |
| 迭代 DFS | 無棧溢位、空間通常較 BFS 省 | 順序非層序 |
unordered_map 預設支援指標雜湊。本題保證 label (val) 唯一,若不唯一,必須用指標/記憶體位址作鍵,不可用值作鍵。