无向图的深度优先遍历非递归_LeetCode133-克隆图(附详细测试用例构建方法)
今天最最最开心激动的一件事
就是自己的论文终于出版了
虽然是一篇口碑不好的文章
但还是有些激动啊
千里之行始于足下
希望自己有个好的前景
题目描述:
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。
class Node {public int val;public List<Node> neighbors;
}
测试用例格式:
简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1,第二个节点值为 2,以此类推。该图在测试用例中使用邻接列表表示。
邻接列表是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。
给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。
示例 1:
输入:adjList = [[2,4],[1,3],[2,4],[1,3]]
输出:[[2,4],[1,3],[2,4],[1,3]]
解释:
图中有 4 个节点。
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
思路:
本题就是考察图的遍历,图的遍历方法有深度优先遍历(DFS)和广度优先遍历(BFS)两种方法。而关于这两种方法的复现大家想必也比较熟悉,网上也有诸多资料。此处我想讲讲如何构建本题所用的测试样例。
题目中是给出了测试样例,但是它给的是邻接列表形式,不是代码给定的Node节点正规格式。当然了,以邻接列表形式给出能更形象的表示出图,但是我们自己在做题时肯定是想着自己构建出正确的测试样例出来,这样不管是解题还是测试都会很方便。我在网上查了很多资料,结果都没有看到构建简单无向图的方法,这让我有些受挫,本着方便他人的心态,我挠破脑皮终于想到了构建测试样例的方法。
构建测试样例代码如下:
def createGraph(edges):"""构建无向图:param edges: List[List[int]] -> 图中所有边的集合:return: Node -> 无向图"""lookup = {}for edge in edges:if edge[0] not in lookup:lookup[edge[0]] = Node(edge[0])if edge[1] not in lookup:lookup[edge[1]] = Node(edge[1])lookup[edge[0]].neighbors.append(lookup[edge[1]])lookup[edge[1]].neighbors.append(lookup[edge[0]])return lookup[edges[0][0]]
代码并不复杂,关键就是定义出一个lookup字典来保存每个节点的相关信息,当遍历到该节点时直接取出即可。
我觉得这是本题的关键,此处解决了,后面的解题也就很快了。我用的是深度优先遍历方法,核心也是定义出一个lookup字典来保存每个节点的相关信息。
代码如下:
class Node(object):def __init__(self, val = 0, neighbors = []):self.val = valself.neighbors = neighborsclass Solution(object):def cloneGraph(self, node):""":type node: Node:rtype: Node"""lookup = {}def dfs(node):if not node: returnprint(node.val)if node in lookup:return lookup[node]clone = Node(node.val, [])lookup[node] = clonefor n in node.neighbors:clone.neighbors.append(dfs(n))return clonereturn dfs(node)def createGraph(edges):"""构建无向图:param edges: 图中所有边的集合:return: 无向图"""lookup = {}for edge in edges:if edge[0] not in lookup:lookup[edge[0]] = Node(edge[0])if edge[1] not in lookup:lookup[edge[1]] = Node(edge[1])lookup[edge[0]].neighbors.append(lookup[edge[1]])lookup[edge[1]].neighbors.append(lookup[edge[0]])return lookup[edges[0][0]]if __name__ == "__main__":edges = [[1, 2], [2, 3], [3, 1]]graph = createGraph(edges)print(graph)cloneGraph = Solution().cloneGraph(graph)print(cloneGraph)
执行效率相对较差,在10%左右,属实尴尬了。
无向图的深度优先遍历非递归_LeetCode133-克隆图(附详细测试用例构建方法)相关推荐
- 无向图的深度优先遍历非递归_LeetCode0429: N叉树的层序遍历
题目介绍 描述: 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历:[[1],[3,2,4],[5,6] ]说明:树的深度不会超过 ...
- 无向图的深度优先遍历非递归_【数据结构图(一)】什么是图
一.什么是"图"(Graph) 表示"多对多"的关系 包含 一组顶点:通常用 V (Vertex) 表示顶点集合 一组边:通常用 E (Edge) 表示边的集合 ...
- 无向图的深度优先遍历非递归_图算法总结
@[TOC] 图算法 1.图的表示 1.1.邻接矩阵(有向图.无向图.带权图.代码实现) 1.无向图的邻接矩阵 2.有向图的邻接矩阵 3.带权值的图 有了上述的理解,我们可以设计数据结构,并实现了. ...
- java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...
1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...
- 2021 - 10 -7 ! 二叉树的前序、中序、后序遍历 非递归思路(迭代版本)
//! 前序遍历的非递归版本,精髓在于用栈模拟递归的过程,但实际进栈出栈顺序与递归并不一样, //! 比较抽象,建议画图理解,比较重要 void BinarySearchTreesZH::preord ...
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...
- 二叉树后序遍历_二叉树后序遍历非递归实现
二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...
- 二叉树后序遍历(非递归)
原文地址为: 二叉树后序遍历(非递归) 二叉树的递归遍历算法就不用说了:在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着 ...
- N皇后问题递归求解(内附详细代码)
N皇后问题递归求解(内附详细代码) 内容描述 在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行.不同列.不同对角线. 解题思路 下面我们以4皇后问题举例: 设queen(i,n)是在1-i-1行 ...
最新文章
- 城市大脑与智慧城市前沿趋势 主题论坛 |未来科技大讲堂 第12期
- PAT甲级1107 Social Clusters (30 分):[C++题解]并查集,爱好、人数
- freertos之任务
- tinycore 的基本搭建,开机时间只需要1-3秒
- [批处理]自动设置本机系统代理服务器
- C#生成CHM文件(中级篇)
- React Native 一些事
- OpenCv之图像二值化(笔记12)
- 小米推新,黄章怒骂!留给魅族们的时间不多了 | 畅言
- java中面向对象6_Java面向对象
- linux日志关键词高亮,【转载】Linux使用tailf高亮显示关键字
- 赋能数字化生命力,让企业未来焕发青春
- HTML/CSS 常用单词整理
- 在图片上添加文字并生成图片
- 快捷餐饮之店家后台订单管理实现
- idea 亮度 调整_AOC显示器亮度怎么调 冠捷亮度调整方法
- 阿里拍卖面试题:实现一个重拍序
- 诊所信息管理系统C语言课程设计
- Android模拟器检测体系梳理
- 450分学计算机能上的二本学校,高考考了450分能上什么大学 450分左右的理科大学有哪些...
热门文章
- 谈谈你对oracle,对Oracle的优化
- java的interface_java中如何实现一个接口interface-百度经验
- jsp怎么调用servlet_Servlet简述
- 基于redis购物车java代码_基于redis实现购物车基本功能
- Java基础常见的面试题
- uniapp同步获取用户信息_表单设计是为了帮助用户获取信息,而不是填写
- python简单的编程_简单的Python2.7编程初学经验总结
- php持久对象,php-在理论中具有两个外来身份的持久对象
- .pyc文件还原.py文件_Python文件.py转换为.exe可执行程序,制作.exe文件图标
- ssm实现管理员和用户_基于SSM的网上水果生鲜超市商城管理系统