LeetCode-133.克隆圖(相關話題:廣度優先)
阿新 • • 發佈:2018-12-22
克隆一張無向圖,圖中的每個節點包含一個 label (標籤)和一個 neighbors (鄰接點)列表 。
OJ的無向圖序列化:
節點被唯一標記。
我們用 # 作為每個節點的分隔符,用 , 作為節點標籤和鄰接點的分隔符。
例如,序列化無向圖 {0,1,2#1,2#2,2}。
該圖總共有三個節點, 被兩個分隔符 # 分為三部分。
- 第一個節點的標籤為 0,存在從節點 0 到節點 1 和節點 2 的兩條邊。
- 第二個節點的標籤為 1,存在從節點 1 到節點 2 的一條邊。
- 第三個節點的標籤為 2,存在從節點 2 到節點 2 (本身) 的一條邊,從而形成自環。
我們將圖形視覺化如下:
1
/ \
/ \
0 --- 2
/ \
\_/
Java程式碼:
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { if (null == node) return null; UndirectedGraphNode head = new UndirectedGraphNode(node.label); Queue<UndirectedGraphNode> queue = new java.util.concurrent.LinkedBlockingQueue<>(); Queue<UndirectedGraphNode> queue1 = new java.util.concurrent.LinkedBlockingQueue<>(); Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>(); queue.add(node); queue1.add(head); map.put(node, head); while (!queue.isEmpty()) { UndirectedGraphNode cur = queue.poll(); UndirectedGraphNode tmp = queue1.isEmpty() ? new UndirectedGraphNode(cur.label) : queue1.poll(); for (UndirectedGraphNode graphNode: cur.neighbors) { UndirectedGraphNode graphNode1 = null == map.get(graphNode) ? new UndirectedGraphNode(graphNode.label) : map.get(graphNode); tmp.neighbors.add(graphNode1); if (null == map.get(graphNode)) { queue.add(graphNode); queue1.add(graphNode1); map.put(graphNode, graphNode1); } } } return head; }