137 - 克隆图

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;
	    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值