题目描述:
本题重点在于避免重复生成节点,避免在构造节点的相邻节点时插入重复节点。
为避免超时问题,在遍历图的过程中,就生成新节点,并构造节点的相邻节点。
代码:
UndirectedGraphNode* cloneGraph(UndirectedGraphNode* node) { // write your code here if(node == NULL) return NULL; unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> match; queue<UndirectedGraphNode*> que; map<UndirectedGraphNode*, bool> isvisited; que.push(node); isvisited[node] = true; match[node] = new UndirectedGraphNode(node->label); while(!que.empty()){ UndirectedGraphNode* tmp = que.front(); que.pop(); for(int i=0; i<tmp->neighbors.size(); ++i){ if(isvisited[tmp->neighbors[i]] == false){ //如果这个相邻节点还没有生成新的副本 UndirectedGraphNode* temp = new UndirectedGraphNode(tmp->neighbors[i]->label); isvisited[tmp->neighbors[i]] = true; match[tmp->neighbors[i]] = temp; que.push(tmp->neighbors[i]); //压入到队列中的都是已经生成副本的节点 match[tmp]->neighbors.push_back(temp);//在弹出时,就不用考虑当前节点,只关注节点的相邻节点是否已经生成副本 } else{ //已经生成新副本,直接把这个节点的副本压入到当前节点tmp的副本的vector中 match[tmp]->neighbors.push_back(match[tmp->neighbors[i]]); } } } return match[node]; }参考博客:https://blog.csdn.net/zhaohengchuan/article/details/76196724