標籤:des style blog color strong art
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 #.
- First node is labeled as
0. Connect node 0 to both nodes 1 and 2.
- Second node is labeled as
1. Connect node 1 to node 2.
- 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 / \_/
題解:利用DFS遞迴的方法複製圖,用hashmap儲存原圖中的節點和新圖中的節點的對應關係。而且利用這個hashmap可以在O(1)的時間內判斷一個節點是否被複製過,並且知道複製它得到的新節點。
實現一個複製節點的方法,在這個方法中:
- 判斷這個節點是否被clone過了,如果是,返回它對應的clone節點;
- 如果沒有被clone過,那麼建立節點為該節點的clone節點,並且遞迴的clone它的鄰居節點,放入該節點的neighbors列表裡面;
代碼如下:
1 /** 2 * Definition for undirected graph. 3 * class UndirectedGraphNode { 4 * int label; 5 * List<UndirectedGraphNode> neighbors; 6 * UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); } 7 * }; 8 */ 9 public class Solution {10 private HashMap<UndirectedGraphNode,UndirectedGraphNode> mapClone = new HashMap<UndirectedGraphNode,UndirectedGraphNode>();11 12 private UndirectedGraphNode cloneNode(UndirectedGraphNode node){13 if(node == null)14 return null;15 //if this node already has a clone16 if(mapClone.containsKey(node))17 return mapClone.get(node);18 19 //if this node hasn‘t been cloned, we construct a new node copy20 UndirectedGraphNode copy = new UndirectedGraphNode(node.label);21 mapClone.put(node, copy);22 23 //clone all the neighbers of node24 for(UndirectedGraphNode n:node.neighbors){25 copy.neighbors.add(cloneNode(n));26 }27 return copy;28 }29 public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {30 return cloneNode(node);31 }32 }