LeetCode.克隆图

深度优先之克隆图

原理理解

原题描述
深度优先中有递归,再加上多了个 无向连通图,着实难以理解,整理思路如下。

    map<node,node> hashmap = new HashMap<>();//每次进入克隆函数先把要克隆的node放到hashmap中
        1.clone node_1: neighbors =	node_2	//未在hashmap中,clone node_2,进入2步骤
	                                node_4	//深度优先,所以node_2 执行完所有的层级后开始克隆node_4,发现已经在node_2的分支遍历中添加到hashmap中了,所以直接add(node_4)
		                            return node_1;//           至此结束深度拷贝

        2.clone node_2: neighbors =	node_1	//已经在hashmap中,直接add(node_1的引用)
	                                node_3	//未在hashmap中,clone node_3,进入3步骤
		                            return node_2//返回1步骤

        3.clone node_3: neighbors =	node_2	//同上,add(node_2的引用)
	                                node_4	//未添加到hashmap中,clone node_4,进入4步骤
		                            return node_3//返回2步骤

        4.clone node_4: neighbors =	node_1	//同上,add(node_1的引用)
	                                node_3	//同上,add(node_3的引用)
		                            return node_4//返回3步骤

具体代码实现

class Node {
    public int val;
    public List<Node> neighbors;

    public Node() {}

    @Override
    public String toString() {
        return "Node{" +
                "val=" + val +
                ", neighbors=" + neighbors +
                '}';
    }

    public Node(int _val, List<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
};
public class CloneGraph {
    Map<Node,Node> map = new HashMap<>();


    public Node cloneGraph(Node node) {
        if(null == node)
            return node;
        map.put(node,new Node(node.val, new ArrayList<>()));
        for(Node n : node.neighbors)
        {
            if(map.containsKey(n))
            {
                map.get(node).neighbors.add(n);
            }
            else
            {
                map.get(node).neighbors.add(cloneGraph(n));
            }
        }
        return map.get(node);
    }
   
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值