2017.10.19
这个好像采用递归的方法不太行得通。
相当于广度遍历图,一个一个的新建节点,并且建立相应的联系。
还是注意要设置visit,这样可以避免在出现环的情况下,程序陷入死循环。
/**
* Definition for undirected graph.
* class UndirectedGraphNode {
* int label;
* ArrayList<UndirectedGraphNode> neighbors;
* UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
* };
*/
public class Solution {
/*
* @param node: A undirected graph node
* @return: A undirected graph node
*/
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
// write your code here
if(node == null || node.neighbors.isEmpty()){
return node;
}
LinkedList<UndirectedGraphNode> queue = new LinkedList<>();
HashMap<Integer,UndirectedGraphNode> map = new HashMap<>();
HashSet<UndirectedGraphNode> visit = new HashSet<>();
queue.addFirst(node);
UndirectedGraphNode newNode = new UndirectedGraphNode(node.label);
map.put(node.label, newNode);
while(!queue.isEmpty()){
node = queue.pollLast();
System.out.println("目标的根的值为" + node.label);
if(visit.contains(node)){
continue;
}
else{
visit.add(node);
}
if(!map.containsKey(node.label)){
UndirectedGraphNode myNode = new UndirectedGraphNode(node.label);
map.put(node.label, myNode);
System.out.println("已经复制根的值为" + node.label+"的节点");
}
//开始遍历node 的邻居们
for(UndirectedGraphNode neigh : node.neighbors){
System.out.print("孩子节点" + neigh.label + " ");
}
System.out.println();
System.out.println("开始遍历" + node.label + "的节点的邻居们");
for(UndirectedGraphNode neigh : node.neighbors){
if(!map.containsKey(neigh.label)){
UndirectedGraphNode newNeigh = new UndirectedGraphNode(neigh.label);
map.put(neigh.label, newNeigh);
map.get(node.label).neighbors.add(newNeigh);
System.out.println("新建并加入节点" + newNeigh.label);
}
else {
map.get(node.label).neighbors.add(map.get(neigh.label));
System.out.println("加入节点" + neigh.label);
}
if(!neigh.equals(node)){
queue.addFirst(neigh);
System.out.println("将节点" + neigh.label + "加入到队列中");
}
}
}
return newNode;
}
}