题目
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 node0to both nodes1and2. - Second node is labeled as
1. Connect node1to node2. - Third node is labeled as
2. Connect node2to node2(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; ArrayListneighbors; 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; } }