一. 可以参考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;
}
};