算法记录
LeetCode 题目:
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝。图中的每个节点都包含它的值 val 和其邻居的列表(list[Node])。
说明
一、题目
邻接列表是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。
给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。
二、分析
- 也就是需要将题目给定的图的存储结构进行一遍复制,那么避免不了的就是对于图的遍历,这里使用深度优先的方式进行遍历。
- 因为是无向图,为此我们不知道结束复制的终点,设计一个 Map 来对复制结果进行保存,这样就避免死循环或者栈溢出。
- 每遍历一个节点时优先递归他的第一个邻接节点,还要注意添加缓存的时期,要在节点创建之后马上进行添加,不然就会导致栈溢出。
class Solution {
private Map<Integer, Node> visitor = new HashMap();
public Node cloneGraph(Node node) {
if(node == null) return null;
if(visitor.containsKey(node.val)) return visitor.get(node.val);
Node newNode = new Node(node.val, new ArrayList());
visitor.put(node.val, newNode);
for(Node temp : node.neighbors) {
newNode.neighbors.add(cloneGraph(temp));
}
return newNode;
}
}
总结
图的遍历方式,深度优先、广度优先。