题目:
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 node0
to both nodes1
and2
. - Second node is labeled as
1
. Connect node1
to node2
. - Third node is labeled as
2
. Connect node2
to node2
(itself), thus forming a self-cycle.
Visually, the graph looks like the following:
1
/ \
/ \
0 --- 2
/ \
\_/
题意及分析:
复制一个无向图。这里考察的是图的遍历,可以使用bfs或者dfs。主要需要使用一个hashmap来映射原图和新图,这样就可以知道某个点是否遍历过。bfs是先遍历某个点,然后遍历该点的所有相邻点,dfs是先遍历某个点,然后向带点的某个相邻点继续遍历。
代码(BFS):
/** * 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; Queue<UndirectedGraphNode> queue = new LinkedList<>(); HashMap<UndirectedGraphNode,UndirectedGraphNode> map = new HashMap<UndirectedGraphNode,UndirectedGraphNode>(); //记录该点是否被遍历过 UndirectedGraphNode newHead = new UndirectedGraphNode(node.label); queue.add(node); map.put(node,newHead); while(!queue.isEmpty()){ UndirectedGraphNode cur = queue.poll(); List<UndirectedGraphNode> curNeighbors=cur.neighbors; for(UndirectedGraphNode aNeighbor : curNeighbors){ //遍历该点的所有相邻点 if(!map.containsKey(aNeighbor)){ UndirectedGraphNode copy = new UndirectedGraphNode( //若该点没有遍历过那么将该点添加进去 aNeighbor.label); map.put(aNeighbor,copy); map.get(cur).neighbors.add(copy); queue.add(aNeighbor); }else{ //该点已被遍历过,那么将当前点作为该点的相邻点添加进去 map.get(cur).neighbors.add(map.get(aNeighbor)); } } } return newHead; } }
代码(dfs):
/** * Definition for undirected graph. * class UndirectedGraphNode { * int label; * List<UndirectedGraphNode> neighbors; * UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); } * }; */ public class Solution { HashMap<UndirectedGraphNode,UndirectedGraphNode> map=new HashMap<>(); public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { if(node==null) return null; if(map.containsKey(node)){ return map.get(node); } UndirectedGraphNode newHead = new UndirectedGraphNode(node.label); map.put(node,newHead); for(UndirectedGraphNode aNeighbor:node.neighbors){ newHead.neighbors.add(cloneGraph(aNeighbor)); } return newHead; } }