0BFS/DFS/图中等 LeetCode133. 克隆图

133. 克隆图

描述

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。

分析

创建新的图,主要需要完成两个工作:1.创建新结点;2.为新结点的邻接点赋值。

DFS

map起到保存新旧节点映射关系的作用,同时有记录是否已经遍历过某个结点,已经创建了对应新结点的效果。
递归,首先判断map里面有没有旧结点,有则返回对应的新结点。没有则创建新结点,并且为新结点的临界单链表赋值。

class Solution {
    public Node cloneGraph(Node node) {
        Map<Node,Node> map = new HashMap<>();
        if(node == null){
            return null;
        }
        Node newHead = new Node(node.val,new ArrayList<>());
        return dfs(map,node);
    }

    public Node dfs(Map<Node,Node> map, Node node){
        if (map.containsKey(node)) return map.get(node);
        Node newNode = new Node(node.val,new ArrayList<>());
        map.put(node,newNode);
        for(Node aft : node.neighbors){
            map.get(node).neighbors.add(dfs(map,aft));
        }
        return map.get(node);
    }
}
BFS

map集合的作用是记录一个旧的node是否已经被遍历过,同时还可以获取与node对应的新node。
借助Queue队列遍历全部的node。有两种情况,一种是旧node没有在map中,则加入队列,并且new一个对应的新node,然后一起加入map中;另一种是旧node在map中,那就没必要创建新node了。
每弹出一个结点,都要为新node的邻接点赋值。

class Solution {
    public Node cloneGraph(Node node) {
        Map<Node,Node> map = new HashMap<>();
        if(node == null){
            return null;
        }
        Node newHead = new Node(node.val,new ArrayList<>());
        map.put(node,newHead);
        Queue<Node> que = new LinkedList<>();
        que.offer(node);
        while(!que.isEmpty()){
            Node tmp = que.poll();
            for(Node aft : tmp.neighbors){
                if(!map.containsKey(aft)){
                    Node newaft = new Node(aft.val,new ArrayList<>());
                    map.put(aft,newaft);
                    que.offer(aft);
                }
                map.get(tmp).neighbors.add(map.get(aft));
            }
        }
        return newHead;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值