Q:本题要求复制一个无向图,图中每个节点都包含一个标签和它的邻居列表
我们无向图用以下的方法序列化:
- 节点的标签是互不相同的,
- 我们使用“#”作为节点之间的分隔符,使用“,”作为节点标签和节点的节点邻居的分隔符。
例如:现在有一个序列化的无向图{0,1,2#1,2#2,2}.
这个无向图一共有3个节点,因此序列被#分隔成三部分
- 第一个节点的标签是0,节点0和节点1,节点2之间有边
- 第二个节点的标签是1,节点1和节点2之间有边
- 第三个节点的标签是2,节点2和节点2(它自己)之间有边,形成了自环
A:
设置图结构:
class UndirectedGraphNode {
int label;
ArrayList<UndirectedGraphNode> neighbors;
UndirectedGraphNode(int x) {
label = x;
neighbors = new ArrayList<UndirectedGraphNode>();
}
};
DFS,递归。
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
HashMap<Integer, UndirectedGraphNode> map = new HashMap<>();
return clone(map, node);
}
public static UndirectedGraphNode clone(HashMap<Integer, UndirectedGraphNode> map, UndirectedGraphNode node) {
if (node == null)
return null;
if (map.containsKey(node.label))
return map.get(node.label);
UndirectedGraphNode node1 = new UndirectedGraphNode(node.label);
map.put(node1.label, node1);//放在循环前面,否则由于后面的操作会出现访问不到的情况
for (UndirectedGraphNode neibor : node.neighbors) {
node1.neighbors.add(clone(map, neibor));
}
return node1;
}
BFS:使用队列,类似层次遍历
public UndirectedGraphNode cloneGraph1(UndirectedGraphNode node) {
if (node == null)
return node;
HashMap<UndirectedGraphNode, UndirectedGraphNode> visited = new HashMap<>();
Queue<UndirectedGraphNode> queue = new LinkedList<>();
queue.add(node);
visited.put(node, new UndirectedGraphNode(node.label));
while (!queue.isEmpty()) {
UndirectedGraphNode n = queue.remove();
for (UndirectedGraphNode neighbor : node.neighbors) {
if (!visited.containsKey(neighbor)) {
visited.put(neighbor, new UndirectedGraphNode(neighbor.label));
queue.add(neighbor);
}
visited.get(n).neighbors.add(visited.get(neighbor));
}
}
return visited.get(node);
}