LeetCode-克隆图

1,458 阅读1分钟

算法记录

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;
    }
}

总结

图的遍历方式,深度优先、广度优先。