133. 克隆图

120 阅读1分钟

image.png

image.png

  • 为了防止多次遍历同一个节点,陷入死循环,我们需要用一种数据结构记录已经被克隆过的节点。

dfs

class Solution {
    Map<Node, Node> visited = new HashMap<>();
    public Node cloneGraph(Node node) {
        if (node == null) {
            return null;
        }
        // 已经复制过了,直接取,避免重复
        if (visited.containsKey(node)) {
            return visited.get(node);
        }
        // 复制当前节点
        Node newNode = new Node(node.val, new ArrayList<>());
        visited.put(node, newNode);
        // 复制当前节点的邻居,dfs
        for (Node n : node.neighbors) {
            newNode.neighbors.add(cloneGraph(n));
        }
        return newNode;
    }
}

bfs

class Solution {
    Map<Node, Node> visited = new HashMap<>();
    public Node cloneGraph(Node node) {
        if (node == null) {
            return node;
        }
        Queue<Node> queue = new LinkedList<>();
        queue.offer(node);
        visited.put(node, new Node(node.val, new ArrayList<>()));// 拷贝当前节点
        while (!queue.isEmpty()) {
            Node n = queue.poll();
            for (Node nb : n.neighbors) {
                if (!visited.containsKey(nb)) {
                    // 拷贝当前节点的邻居
                    visited.put(nb, new Node(nb.val, new ArrayList<>()));
                    queue.add(nb);
                }
                // 更新当前节点的邻居
                visited.get(n).neighbors.add(visited.get(nb)); 
            }
        }
        return visited.get(node);
    }
}