Time: 20190903
Type: Medium

题目描述

给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。

示例 1:

输入: n = 5, 边列表 edges = [[0,1], [0,2], [0,3], [1,4]]
输出: true
示例 2:

输入: n = 5, 边列表 edges = [[0,1], [1,2], [2,3], [1,3], [1,4]]
输出: false
注意:你可以假定边列表 edges 中不会出现重复的边。由于所有的边是无向边,边 [0,1] 和边 [1,0] 是相同的,因此不会同时出现在边列表 edges 中。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/graph-valid-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

按照题目的要求可以得到一个无向图,判断这个无向图是不是树。是树的话满足两个要求:

  • 全部结点互相链接
  • 图中无环

用并查集的思路是最直接的,初始时将结点的父节点都定义为自身,在最初Union边的两个结点时,结点是属于不同的子集的,一旦二者的大Boss是一样的,即属于同一个子集,表示有环存在。

这个结论第一次听起来很奇怪,但是跟踪一下合并过程就清楚了。

开始时是散落的多个结点,开始选取其中两个连线,会出现多个小分组,每个分组内的结点的大Boss一样。此时如果选中的两个结点来自同一个分组,Union起来一定是有环的。因此,我们在Union方法中做判断即可。

Find方法有不同的写法,递归或者非递归。递归的话自带路径压缩,迭代算法需要自己写路径压缩。并查集是需要路径 压缩的,即让一个子集内的结点统一战线。

代码

极简版的并查集算法(不含权重)。

class DSU:def __init__(self):self.par = list(range(5001)) # 初始化时父亲结点指向自身self.rnk = [0] * 5001def find(self, x):if self.par[x] != x:self.par[x] = self.find(self.par[x])return self.par[x]def union(self, x, y):xr, yr = self.find(x), self.find(y)if xr == yr:return Falseelif self.rnk[xr] < self.rnk[yr]:self.par[xr] = yrelif self.rnk[xr] > self.rnk[yr]:self.par[yr] = xrelse:self.par[yr] = xrself.rnk[xr] += 1return Trueclass Solution:def validTree(self, n: int, edges: List[List[int]]) -> bool:uf = DSU()for e in edges:# 判断有没有环if(uf.union(e[0], e[1]) == False): return False# 图可能没有连通,例如[[1, 2], [3, 4]] # 需要判断是不是所有节点的父亲都一样par = uf.find(0)for i in range(1, n):if par != uf.find(i): return Falsereturn True

相似题目

Leetcode 323. 无向图中连通分量的个数

都是用并查集的典型算法。

END.

Leetcode 261.以图判树相关推荐

  1. LeetCode 261. 以图判树(全部连通+边数=V-1)

    文章目录 1. 题目 2. 解题 1. 题目 给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示), 请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构. 示 ...

  2. leetcode261. 以图判树

    给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构. 示例 1: 输入: n = 5, 边列表 edge ...

  3. leetcode刷题之树(三)

    翻转二叉树,感觉做二叉树的问题好像都是那一套公式,除了个别的问题解决不了,用上篇博客leetcode刷题之树(二)的模型基本可以解决.总体来说就是树基本都可以利用递归和迭代的方法去解决,在涉及到树的遍 ...

  4. LeetCode 572. 另一个树的子树 思考分析

    题目 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: 给定 ...

  5. 四 . LeetCode标签刷题——树/二叉树(一) 算法部分

    各种二叉树的介绍汇总: 二叉树:最多有两棵子树的树被称为二叉树 满二叉树:二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上 完全二叉树:如果一个二叉树与满二叉树前m个节点的结构相同,这样的二 ...

  6. LeetCode 100相同的树101对称二叉树

    微信搜一搜:bigsai 大家都在关注的刷题.学习数据结构和算法宝藏项目 关注回复进群即可加入力扣打卡群,欢迎划水.近期打卡: (https://bigsai.blog.csdn.net/articl ...

  7. LeetCode 310. 最小高度树(图 聪明的BFS,从外向内包围)

    文章目录 1. 题目 2. 解题 2.1 暴力BFS 2.2 聪明的BFS 1. 题目 对于一个具有树特征的无向图,我们可选择任何一个节点作为根.图因此可以成为树,在所有可能的树中,具有最小高度的树被 ...

  8. LeetCode 572. 另一个树的子树(二叉树迭代器)

    1. 题目 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: ...

  9. C#LeetCode刷题-字典树

    字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树) 48.6% 中等 211 添加与搜索单词 - 数据结构设计 39.9% 中等 212 单词搜索 II 27.9% 困难 33 ...

最新文章

  1. python基础函数图_Python基础:函数
  2. 黑客窃取思科、IBM与甲骨文认证管理系统内的敏感数据
  3. linux 查看其他磁盘分区,Linux 查看磁盘分区.pdf
  4. C#高级应用之CodeDomProvider引擎篇 .
  5. 的微波感知_上海交大彭志科教授团队研发:微波微动监测与智能感知技术
  6. Python3中queue模块的使用
  7. python路径中有中文_python3 网址路径中带中文的处理办法
  8. 开源编辑器Makedown的安装
  9. [原创]性能测试工程师试题
  10. dx 汇编dec_汇编语言——汇编指令
  11. 在ubuntu中安装DroidCam 让Andorid 安卓手机摄像头成为Linux外部可移动摄像头
  12. j2Cache线上异常问题排查记录
  13. 雷军博客分享-日本的电饭煲到底好在哪?
  14. 蓝桥杯C语言算法提高:复数归一化
  15. 【C语言】习题3-2 高速公路超速处罚
  16. 测试人员进阶之路:成为测试专家或测试管理都需要知道什么
  17. js毫秒转换年月日时分秒
  18. 技术总监.部门经理.程序员
  19. python爬虫相关坑坑洼洼
  20. PHP 手机靓号规则、正则匹配、号码查询

热门文章

  1. tensorflow随笔——concat(), stack(), unstack()
  2. 文件操作之fread()和fwrite()函数
  3. (带区号)座机号正则_字符串处理之正则表达式(通俗易懂)
  4. if __name__ == __main___一文搞懂 if __name__ == #39;__main__#39;
  5. python源码剖析读书笔记总结_《Python源码剖析》读书笔记:内存垃圾回收
  6. 对象删除某个属性_充分了解JavaScript中【对象】的概念(二)
  7. 把string时间取出月份_农村集市上现杀活蚌取出来的珍珠,是真的吗?为何价格这么便宜?...
  8. 仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题
  9. rstudio r语言_如何在R中接受用户输入?
  10. python zip函数_Python zip()函数