题目描述
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val
(int
) 和其邻居的列表(list[Node]
)。
题解
使用 HashMap 存储所有访问过的节点和克隆节点。HashMap 的 key 存储原始图的节点,value 存储克隆图中的对应节点。visited 用于防止陷入死循环,和获得克隆图的节点。
将第一个节点添加到队列。克隆第一个节点添加到名为 visited 的 HashMap 中。
BFS 遍历
从队列首部取出一个节点。
遍历该节点的所有邻接点。
如果某个邻接点已被访问,则该邻接点一定在 visited 中,那么从 visited 获得该邻接点。
否则,创建一个新的节点存储在 visited 中。
将克隆的邻接点添加到克隆图对应节点(步骤1中得到的首部节点)的邻接表中。
作者:LeetCode
链接:https://leetcode-cn.com/problems/clone-graph/solution/ke-long-tu-by-leetcode/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include<unordered_map> Node* cloneGraph(Node* node) { if (!node)return NULL; unordered_map<Node*, Node*>visited; visited[node] = new Node(node->val); queue<Node*>que; que.push(node);
Node* tmpNode; vector<Node*> tmpVec; while (!que.empty()) { tmpNode=que.front(); que.pop(); tmpVec = tmpNode->neighbors; for (Node* n : tmpVec) { if (!visited.count(n)) { Node* newNode = new Node(n->val); visited[n] = newNode; que.push(n); } visited[tmpNode]->neighbors.push_back(visited[n]); } } return visited[node]; }
|