1. 程式人生 > 實用技巧 >LeetCode 133 克隆圖

LeetCode 133 克隆圖

Leetcode 133 克隆圖

給定一個無向圖,要求給出該無向圖的深克隆圖(所謂深克隆是指克隆圖中的每個節點都要是區別於舊圖對應節點的新節點)
方法: 需要對給定的無向圖進行遍歷(DFS/BFS),遍歷過程中對每個節點進行克隆並建立圖(節點間串聯)
BFS

class Solution {
    public Node cloneGraph(Node node) {
        if (node == null) return null;
        //儲存原圖(old)已遍歷節點、到克隆圖(new)的節點對映
        Map<Node, Node> oldToNew = new HashMap<>();
        Node clone = new Node(node.val, new ArrayList<>());
        oldToNew.put(node, clone);
        Deque<Node> queue = new LinkedList<>();
        queue.offer(node);
        while (!queue.isEmpty()) {
            Node tmp = queue.poll();
            //遍歷並複製原圖tmp節點及其next節點
            for (Node n : tmp.neighbors) {
                //避免重複遍歷原圖節點
                if (!oldToNew.containsKey(n)) {
                    //新增原圖未遍歷節點、克隆圖複製節點
                    oldToNew.put(n, new Node(n.val, new ArrayList<>()));
                    queue.offer(n);
                }
                //新增next node(克隆圖節點串聯)
                oldToNew.get(tmp).neighbors.add(lookup.get(n));
            }
        }
        return clone;
    }
}

DFS

class Solution {
    private HashMap <Node, Node> visited = new HashMap <> ();
    public Node cloneGraph(Node node) {
        if (node == null) {
            return node;
        }

        // 如果該節點已經被訪問過了,則直接從雜湊表中取出對應的克隆節點返回
        if (visited.containsKey(node)) {
            return visited.get(node);
        }

        // 克隆節點,注意到為了深拷貝我們不會克隆它的鄰居的列表
        Node cloneNode = new Node(node.val, new ArrayList());
        // 雜湊表儲存
        visited.put(node, cloneNode);

        // 遍歷該節點的鄰居並更新克隆節點的鄰居列表
        for (Node neighbor: node.neighbors) {
            cloneNode.neighbors.add(cloneGraph(neighbor));
        }
        return cloneNode;
    }
}