leetcode133. 克隆图
给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node])。
示例:
输入:
{"$id":"1","neighbors":[{"$id":"2","neighbors":[{"$ref":"1"},{"$id":"3","neighbors":[{"$ref":"2"},{"$id":"4","neighbors":[{"$ref":"3"},{"$ref":"1"}],"val":4}],"val":3}],"val":2},{"$ref":"4"}],"val":1}
解释:
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
提示:
节点数介于 1 到 100 之间。
无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
必须将给定节点的拷贝作为对克隆图的引用返回。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/clone-graph
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:
1bfs:层序遍历
在图的遍历中分为层序遍历和深度遍历,和树的遍历基本相同。使用一个hashmap保存所有遇到的节点,借助一个队列linkedlist来实现层序遍历。

1 /*
2 // Definition for a Node.
3 class Node {
4 public int val;
5 public List<Node> neighbors;
6
7 public Node() {}
8
9 public Node(int _val,List<Node> _neighbors) {
10 val = _val;
11 neighbors = _neighbors;
12 }
13 };
14 */
15 class Solution {
16 public Node cloneGraph(Node node) {
17 if(node==null)
18 return null;
19 HashMap<Node,Node> map=new HashMap<>();
20 LinkedList<Node> list=new LinkedList<>();
21 Node clone=new Node(node.val,new ArrayList<Node>());
22 map.put(node,clone);
23 list.add(node);
24 while(!list.isEmpty())
25 {
26 Node temp=list.remove();
27 for(Node n:temp.neighbors)
28 {
29 if(!map.containsKey(n))
30 {
31 Node next=new Node(n.val,new ArrayList<Node>());
32 map.put(n,next);
33 list.add(n);
34 }
35 map.get(temp).neighbors.add(map.get(n));
36 }
37
38 }
39 return clone;
40 }
41 }
解法2:dfs深度遍历
对于深度遍历来说,依旧需要一个map保存已经创建过的node节点。每一层需要先判断map中是否已经有这个node,有的话就可以直接返回这个node的clone节点,不然需要创建clone节点返回。这道题就变成了递归,那么递归的三要素就需要好好考虑一下, 这里的结束条件应该就是每个节点的neighbors列表遍历完全以后,所以当完成遍历neighbors就返回,返回值是什么呢?因为在遍历的时候还要往复制的node节点里面添加node引用,所以返回值就是复制的node节点,比如说在遍历1的neighbors时遇到2,进入2,那么我们需要返回2的复制节点,这样在1这个节点才会有2的复制,才可以往1的复制节点里面添加2的复制节点。

1 /*
2 // Definition for a Node.
3 class Node {
4 public int val;
5 public List<Node> neighbors;
6
7 public Node() {}
8
9 public Node(int _val,List<Node> _neighbors) {
10 val = _val;
11 neighbors = _neighbors;
12 }
13 };
14 */
15 class Solution {
16 HashMap<Node,Node> map=new HashMap<>();
17 public Node cloneGraph(Node node) {
18 return dfs(node);
19 }
20 public Node dfs(Node node)
21 {
22 if(map.containsKey(node))
23 return map.get(node) ;
24 Node clone=new Node(node.val,new ArrayList<>());
25 map.put(node,clone);
26 for(Node n:node.neighbors)
27 {
28 Node temp=dfs(n);
29 clone.neighbors.add(temp);
30 }
31 return clone;
32 }
33 }
leetcode133. 克隆图的更多相关文章
- LeetCode-133克隆图(图的遍历+深拷贝概念)
克隆图 LeetCode-133 使用一个map来存储已经遍历的结点,这个存起来的结点必须是新new的才符合题意 /* // Definition for a Node. class Node { p ...
- [Java]LeetCode133. 克隆图 | Clone Graph
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...
- Leetcode 133.克隆图
克隆图 克隆一张无向图,图中的每个节点包含一个 label (标签)和一个 neighbors (邻接点)列表 . OJ的无向图序列化: 节点被唯一标记. 我们用 # 作为每个节点的分隔符,用 , 作 ...
- LeetCode 133:克隆图 Clone Graph
题目: 给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node]). Given a reference of a ...
- Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph)
Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree ...
- 【LeetCode】克隆图
[问题]给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node]). 解释: 节点 的值是 ,它有两个邻居:节点 和 ...
- Java实现 LeetCode 133 克隆图
133. 克隆图 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node]). class Node { ...
- 【LeetCode】133. 克隆图
133. 克隆图 知识点:图:递归;BFS 题目描述 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[No ...
- 133克隆图 · Clone Graph
[抄题]: 克隆一张无向图,图中的每个节点包含一个 label 和一个列表 neighbors. [思维问题]: [一句话思路]: 先BFS克隆点(一个点+扩展所有邻居),再克隆邻居(一个点+扩展所有 ...
随机推荐
- 《JavaScript高级程序设计》——第三章 基本概念
这章讲了JavaScript的语法.数据类型.流控制语句和函数.理解还是挺好理解的,但有很多和C.C++.Java不同的地方需要记忆.比如, JavaScript标识符可以由Unicode字符字符组成 ...
- Web前端_流式布局(百分比布局)
移动Web_流式布局(百分比布局) writer:late at night codepeasant 1(百分比布局) ☞核心知识点 1.流式布局(百分比布局) 2.视口设置 ☞今日目标 1. 能够使 ...
- NB-IOT覆盖能力有多强 是怎么实现的
NB-IoT技术中出现以来就以其强大的覆盖能力和通信距离长而受到广大使用者的欢迎,那么NB-IoT覆盖能力究竟是有多大,其覆盖能力应该怎么来衡量? 强大的覆盖能力是NB-IoT技术的最大特点之一,不仅 ...
- Java学习的第五十二天
1.例9.4对象数组的使用方法 public class Cjava { public static void main(String[]args) { Box b[] = {new Box(10,1 ...
- git提交后文件夹显示灰色无法打开的解决办法
上传完本地文件到gitee线上后发现如下情况,文件夹显示为灰色并且无法访问. xxx@xxx 的灰色文件 问题原因 : 无法点击的灰色文件夹中含有 .git 文件 即在本地初始化的仓库(使用 git ...
- 从ReentrantLock加锁解锁角度分析AQS
本文用于记录在学习AQS时,以ReentrantLock为切入点,深入源码分析ReentrantLock的加锁和解锁过程. 同步器AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理 ...
- vim实现CTRL+S为保存快捷键
用vim正撸代码撸的飞起,突然Xshell就掉线了,真是太蛋疼了. 于是开始怀念起vs下撸代码时随时随地ctrl+s保存的快捷键,百度了一下,网上的vim实现ctrl+s保存的快捷键设置都有问题,自己 ...
- 9.集合set和frozenset冻结集合函数
集合set set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以在set中没有重复的key. 集合中的元素要求是不可变的并且还是唯一的,我们就利用它是唯一来做去重. ...
- 使用 .NET 5 体验大数据和机器学习
翻译:精致码农-王亮 原文:http://dwz.win/XnM .NET 5 旨在提供统一的运行时和框架,使其在各平台都有统一的运行时行为和开发体验.微软发布了与 .NET 协作的大数据(.NET ...
- [MIT6.006] 4. Heaps and Heap Sort 堆,堆排序
第4节课仍然是讲排序,但介绍的是一种很高效的堆排序. 在编程过程中,有时候会需要进行extrat_max的操作,即从一个数列里挨个抽取最大值并将其它从原数列中移除.而排序问题也可以看作是一个extra ...