一. 可以參考leetcode138_複製帶隨機指針的鏈表, https://blog.csdn.net/qieyuan4083/article/details/104332467
二. 回溯就是遍歷, 運用DFS和BFS方法.
1. DFS.
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> neighbors;
Node() {
val = 0;
neighbors = vector<Node*>();
}
Node(int _val) {
val = _val;
neighbors = vector<Node*>();
}
Node(int _val, vector<Node*> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
class Solution {
public:
//存放訪問過的圖節點,
//注意存的是指針.
map<Node*, Node*> tmp;
//函數的作用遍歷所有的節點,
//並返回相應的節點.
Node* cloneGraph(Node* node) {
if(node==NULL) return NULL;
//有這個節點,直接返回.
if(tmp.count(node)) return tmp[node];
//否則新建.
Node* n = new Node(node->val);
tmp[node] = n;
//遍歷原先node的所有鄰居,並分別拷貝.
for(auto k:node->neighbors) {
n->neighbors.push_back(cloneGraph(k));
}
return n;
}
};
2. BFS
class Solution {
public:
Node* cloneGraph(Node* node) {
if(node==NULL) return NULL;
//存放已經克隆過的節點.
map<Node*, Node*> mp;
//建立新的克隆節點,但是他的鄰居是沒有填充的.
Node* n = new Node(node->val);
mp[node] = n;
//bfs一般用到隊列.
queue<Node*> dq;
dq.push(node);
while(!dq.empty()) {
Node* tmp = dq.front();
dq.pop();
//對於克隆前的節點的所有鄰居
for(auto k:tmp->neighbors) {
if(!mp.count(k)) {
//如果不存在就創建.
node = new Node(k->val);
mp[k] = node;
//不存在才需要放入隊列中.
//因爲存在的節點的鄰居接下來就會弄齊.
dq.push(k);
}
//如果存在就直接放入克隆後的節點的鄰居vector裏.
mp[tmp]->neighbors.push_back(mp[k]);
}
}
//返回第一個克隆的節點.
return n;
}
};