LeetCode | Clone Graph

2014-11-24 09:11:11 · 作者: · 浏览: 0

题目

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.


OJ's undirected graph serialization:

Nodes are labeled uniquely.

We use # as a separator for each node, and , as a separator for node label and each neighbor of the node.

As an example, consider the serialized graph {0,1,2#1,2#2,2}.

The graph has a total of three nodes, and therefore contains three parts as separated by #.

  1. First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
  2. Second node is labeled as 1. Connect node 1 to node 2.
  3. Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.

    Visually, the graph looks like the following:

           1
          / \
         /   \
        0 --- 2
             / \
             \_/
    分析

    这题与Copy with Random Pointer思路一致,都是通过纪录原节点和新节点的映射关系来构建新的数据结构,只要正确遍历完所有节点即可,如下代码中采用BFS进行遍历。

    代码

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Stack;
    
    public class CloneGraph {
    	class UndirectedGraphNode {
    		int label;
    		ArrayList
        
          neighbors;
    
    		UndirectedGraphNode(int x) {
    			label = x;
    			neighbors = new ArrayList
         
          (); } } public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { if (node == null) { return null; } Stack
          
            stack = new Stack
           
            (); Map
            
              map = new HashMap
             
              (); UndirectedGraphNode root = new UndirectedGraphNode(node.label); map.put(node.label, root); stack.push(node); while (!stack.isEmpty()) { UndirectedGraphNode v = stack.pop(); UndirectedGraphNode newV = map.get(v.label); ArrayList
              
                newNeighbors = new ArrayList
               
                (); for (UndirectedGraphNode w : v.neighbors) { UndirectedGraphNode newW = null; if (map.containsKey(w.label)) { newW = map.get(w.label); } else { newW = new UndirectedGraphNode(w.label); map.put(w.label, newW); stack.push(w); } newNeighbors.add(newW); } newV.neighbors = newNeighbors; } return root; } }