您的位置:首页 > 其它

[LeetCode]: 133: Clone Graph

2015-10-16 11:50 411 查看
题目:

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 node
0
to both nodes
1
and
2
.

Second node is labeled as
1
. Connect node
1
to node
2
.

Third node is labeled as
2
. Connect node
2
to node
2
(itself), thus forming a self-cycle.

Visually, the graph looks like the following:

1
/ \
/   \
0 --- 2
/ \
\_/


题目分析:

题目本身就是个图的遍历问题,其实只用看最上面的一句就OK了。下面整这么一篇就是为了说明Testcase,结果误导对了我好久。

与树的遍历不同之处就是图可能会出现"闭合的环"这样会造成无线循环,所以遍历的时候需要把已经遍历过的点去掉。

根据题目,图中每一个点的权值是不一样的,所以可以采用取巧的方法检测这个点是否已经加在了图中,即使用HashMap

思路一:深度优先搜索

public static UndirectedGraphNode cloneDFS(UndirectedGraphNode node,HashMap<Integer, UndirectedGraphNode> validator){
if(validator.containsKey(node.label)){
return validator.get(node.label);
}

UndirectedGraphNode nodeTemp = new UndirectedGraphNode(node.label);
validator.put(node.label, nodeTemp);

for(int i =0;i<node.neighbors.size();i++){
nodeTemp.neighbors.add(cloneDFS(node.neighbors.get(i),validator));
}

return nodeTemp;
}
public static UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if(node== null ||  node.equals(null)){
return null;
}

HashMap<Integer, UndirectedGraphNode> validator = new HashMap<Integer, UndirectedGraphNode>();
return cloneDFS(node, validator);
}


思路二:广度优先搜索

XXX
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: