【转载请注明】:http://www.javashuo.com/article/p-ppkasvgw-cp.htmlhtml
给出一个无向图,其中保证每点之间均有链接,给出原图中的一个点 node,进行图的复制node
注意数据结构
- 每一个点会与多个其余点进行链接,关注节点数据结构,其中 label 表数值,vector 表链接的节点集合
struct UndirectedGraphNode { int label; vector<UndirectedGraphNode *> neighbors; UndirectedGraphNode(int x) : label(x) {}; };
- 图克隆≠图复制,理解浅拷贝 & 深拷贝
- 浅拷贝 ——只是对指针的拷贝,拷贝后两个指针指向同一个内存空间
- 深拷贝 ——不但对指针进行拷贝,并且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不一样地址的指针。
- 对于每一个节点vector中值,都必须连接到新图的对应节点上
UndirectedGraphNode * newnode = new UndirectedGraphNode (node->label); // 另创结点,深拷贝 unordered_map<UndirectedGraphNode *,UndirectedGraphNode *> hash; // 创建原node → 新node连接
1. 深度优先遍历dfs,采用递归
2. 广度优先遍历bfs函数
- 以 map 记录新旧对应结点
- 若 map 包含结点,直接加入或连接
- 若 map 不包含结点,建立并递归该结点各项内容
class Solution { public: // 递归函数 UndirectedGraphNode *clone(UndirectedGraphNode *node,map<UndirectedGraphNode *,UndirectedGraphNode *>& record){ if(!node) return nullptr; if(record.find(node)!=record.end()){ return record[node]; }else{ UndirectedGraphNode * temp = new UndirectedGraphNode(node->label); record[node]=temp; int size = node->neighbors.size(); for(int i=0;i<size;i++){ temp->neighbors.push_back(clone(node->neighbors[i],record)); } return temp; } } // 主函数 UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { map<UndirectedGraphNode *,UndirectedGraphNode *> record; UndirectedGraphNode * newnode = clone(node,record); return newnode; } };
class Solution { public: unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> hash; UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if (!node) return node; if(hash.find(node) == hash.end()) { hash[node] = new UndirectedGraphNode(node -> label); for (auto x : node -> neighbors) { (hash[node] -> neighbors).push_back( cloneGraph(x) ); } } return hash[node]; } };
- 以 map 记录新旧对应结点
- 若 map 包含结点,直接加入或连接
- 若 map 不包含结点,加入queue 进行后续操做
class Solution { public: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if(!node) return nullptr; map<UndirectedGraphNode *,UndirectedGraphNode *> record; queue<UndirectedGraphNode *> nodelist; nodelist.push(node); // 队列循环 while(!nodelist.empty()){ UndirectedGraphNode * temp = nodelist.front();nodelist.pop(); UndirectedGraphNode * newtemp; // 是否已经被建立 if(record.find(temp)==record.end()){ newtemp = new UndirectedGraphNode(temp->label); record[temp]=newtemp; }else{ newtemp = record[temp]; } int size = temp->neighbors.size(); for(int i=0;i<size;i++){ UndirectedGraphNode * child = temp->neighbors[i]; if(record.find(child)==record.end()){ // 链接结点 UndirectedGraphNode * newchild = new UndirectedGraphNode(child->label); record[child]=newchild; nodelist.push(child); newtemp->neighbors.push_back(newchild); }else{ newtemp->neighbors.push_back(record[child]); } } } return record[node]; } };