01. 克隆图-leetcode133

0.基础知识

1.深拷贝浅拷贝
https://blog.csdn.net/qq_27552845/article/details/105605719
2.BFS,DFS,图

1.题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.分析

neighbors 是一个装 Node 的 list ,因为对象的话,java 变量都存储的是引用,所以复制的话要新 new 一个 Node 放到 neighbors。这个题其实就是对图进行一个遍历,通过 BFS 或者 DFS。需要解决的问题就是怎么添加当前节点的 neighbors,因为遍历当前节点的时候,它的邻居节点可能还没有生成

3.解法1:BFS

Hashmapkey是原始节点,value是新建的对应节点。
在这里插入图片描述

4.解法2:DFS

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> neighbors;
    
    public Node() {
        val = 0;
        neighbors = new ArrayList<Node>();
    }
    
    public Node(int _val) {
        val = _val;
        neighbors = new ArrayList<Node>();
    }
    
    public Node(int _val, ArrayList<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
}
*/
class Solution {
    public Node cloneGraph(Node node) {
         if(node == null){
            return null;
        }
        Map<Node,Node> visited = new HashMap<>();
        return dfs(node,visited);
    }
    public Node dfs(Node node,Map<Node,Node> visited){
        // if(node == null){
        //     return null;
        // }
        //1.说明已经被访问过了,直接返回key对应的value节点
        if(visited.containsKey(node)){
            return visited.get(node);
        }
        //2.说明没被访问过,就新建一个,并放入visied中
        Node temp = new Node(node.val,new ArrayList<>());
        visited.put(node,temp);
        //3.遍历当前节点的邻居列表,将新建的节点(以node为基础建立的空的)的邻居列表添加上cur dfs后返回的对应cur对应建立的新的节点。
        //cur是原始节点,需要以cur为基础去建立新的节点,就是dfs的返回,而在进入到新的dfs之后,又会根据这个cur的neighbors进行再一次的遍历深入,一直遍历到底部,说明遍历完了,就是下一个个节点有被访问过的记录了开始返回
        //---对每个邻居节点进行dfs,这样就能根据当前的节点继续深入到下一次的节点里面,最后一层层返回,到这一步的时候返回的就是cur对应建立的value节点。
        //通常dfs只要判断回溯条件即可,但是这儿的话就在每次dfs后返回了一个没访问过的节点(temp)对应的新建节点。
        for(Node cur:node.neighbors){
            temp.neighbors.add(dfs(cur,visited));
        }
        return temp;
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值