克隆一张无向图,图中的每个节点包含一个 label (标签)和一个 neighbors (邻接点)列表 。
OJ的无向图序列化:
节点被唯一标记。
我们用 # 作为每个节点的分隔符,用 , 作为节点标签和邻接点的分隔符。
例如,序列化无向图 {0,1,2#1,2#2,2}。
该图总共有三个节点, 被两个分隔符 # 分为三部分。
第一个节点的标签为 0,存在从节点 0 到节点 1 和节点 2 的两条边。 第二个节点的标签为 1,存在从节点 1 到节点 2 的一条边。 第三个节点的标签为 2,存在从节点 2 到节点 2 (本身) 的一条边,从而形成自环。 我们将图形可视化如下:
1
/ \
/ \
0 --- 2
/ \
\_/
解:
/**
* Definition for undirected graph.
* class UndirectedGraphNode {
* int label;
* List<UndirectedGraphNode> neighbors;
* UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
* };
*/
public class Solution {
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if (node == null) return null;
UndirectedGraphNode newNode = new UndirectedGraphNode(node.label); //new node for return
HashMap<Integer, UndirectedGraphNode> map = new HashMap(); //store visited nodes
map.put(newNode.label, newNode); //add first node to HashMap
LinkedList<UndirectedGraphNode> queue = new LinkedList(); //to store **original** nodes need to be visited
queue.add(node); //add first **original** node to queue
while (!queue.isEmpty()) { //if more nodes need to be visited
UndirectedGraphNode n = queue.pop(); //search first node in the queue
for (UndirectedGraphNode neighbor : n.neighbors) {
if (!map.containsKey(neighbor.label)) { //add to map and queue if this node hasn't been searched before
map.put(neighbor.label, new UndirectedGraphNode(neighbor.label));
queue.add(neighbor);
}
map.get(n.label).neighbors.add(map.get(neighbor.label)); //add neighbor to new created nodes
}
}
return newNode;
}
}