LeetCode解题笔记 31 —— 133. 克隆图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m940034240/article/details/89521451

题目

给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 valInt) 和其邻居的列表(list[Node])。

示例:

输入:
{"$id":"1","neighbors":[{"$id":"2","neighbors":[{"$ref":"1"},{"$id":"3","neighbors":[{"$ref":"2"},{"$id":"4","neighbors":[{"$ref":"3"},{"$ref":"1"}],"val":4}],"val":3}],"val":2},{"$ref":"4"}],"val":1}

解释:
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。

提示:

  1. 节点数介于 1 到 100 之间。
  2. 无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
  3. 由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
  4. 必须将给定节点的拷贝作为对克隆图的引用返回。

解法

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> neighbors;

    public Node() {}

    public Node(int _val,List<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
};
*/
class Solution {
    public Node cloneGraph(Node node) {
        Map<Integer,Node> map = new HashMap();
        Node n = new Node(node.val, null);
        map.put(node.val,n);
        n.neighbors = copy(node, map);
        return n;
    }
    
    private List<Node> copy(Node node,Map<Integer,Node> map){
        List<Node> list = new ArrayList<>();
        for(Node n : node.neighbors){
            if(map.containsKey(n.val)){//判断该节点是否已经创建了
                list.add(map.get(n.val));
            }else{
                Node nn = new Node(n.val, null);//节点未创建,创建并拷贝neighbors
                list.add(nn);
                map.put(n.val, nn);
                nn.neighbors = copy(n, map);
            }
        }
        return list;
    }
}

猜你喜欢

转载自blog.csdn.net/m940034240/article/details/89521451