LeetCode——克隆图

Q:本题要求复制一个无向图,图中每个节点都包含一个标签和它的邻居列表
我们无向图用以下的方法序列化:

  • 节点的标签是互不相同的,
  • 我们使用“#”作为节点之间的分隔符,使用“,”作为节点标签和节点的节点邻居的分隔符。

例如:现在有一个序列化的无向图{0,1,2#1,2#2,2}.
这个无向图一共有3个节点,因此序列被#分隔成三部分

  • 第一个节点的标签是0,节点0和节点1,节点2之间有边
  • 第二个节点的标签是1,节点1和节点2之间有边
  • 第三个节点的标签是2,节点2和节点2(它自己)之间有边,形成了自环

A:
设置图结构:

class UndirectedGraphNode {
    int label;
    ArrayList<UndirectedGraphNode> neighbors;

    UndirectedGraphNode(int x) {
        label = x;
        neighbors = new ArrayList<UndirectedGraphNode>();
    }
};

DFS,递归。

    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
        HashMap<Integer, UndirectedGraphNode> map = new HashMap<>();
        return clone(map, node);
    }

    public static UndirectedGraphNode clone(HashMap<Integer, UndirectedGraphNode> map, UndirectedGraphNode node) {
        if (node == null)
            return null;
        if (map.containsKey(node.label))
            return map.get(node.label);
        UndirectedGraphNode node1 = new UndirectedGraphNode(node.label);
        map.put(node1.label, node1);//放在循环前面,否则由于后面的操作会出现访问不到的情况
        for (UndirectedGraphNode neibor : node.neighbors) {
            node1.neighbors.add(clone(map, neibor));
        }
        return node1;
    }

BFS:使用队列,类似层次遍历

    public UndirectedGraphNode cloneGraph1(UndirectedGraphNode node) {
        if (node == null)
            return node;
        HashMap<UndirectedGraphNode, UndirectedGraphNode> visited = new HashMap<>();
        Queue<UndirectedGraphNode> queue = new LinkedList<>();
        queue.add(node);
        visited.put(node, new UndirectedGraphNode(node.label));
        while (!queue.isEmpty()) {
            UndirectedGraphNode n = queue.remove();
            for (UndirectedGraphNode neighbor : node.neighbors) {
                if (!visited.containsKey(neighbor)) {
                    visited.put(neighbor, new UndirectedGraphNode(neighbor.label));
                    queue.add(neighbor);
                }
                visited.get(n).neighbors.add(visited.get(neighbor));
            }
        }
        return visited.get(node);
    }
原文地址:https://www.cnblogs.com/xym4869/p/12469172.html