[LeetCode] 133. Clone Graph Java
题目:
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
/ \
\_/
题意及分析:复制一个无向图。这里考察的是图的遍历,可以使用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; } }

浙公网安备 33010602011771号