每日算法:平衡二叉树

自顶向下的比较每个节点的左右子树的最大高度差,如果二叉树中每个节点的左右子树最大高度差小于等于 1 ,即每个子树都平衡时,此时二叉树才是平衡二叉树. 2021-09-29 10:19:00 算法平衡二叉树 鸿蒙应用开发:如何与组件库(Glide)衔接? Android 发展到现在不仅提供了很多 API,还提供了很多第三方库。这降低了我们开发者的开发难度,提升了开发效率,让应用开发更加的简单高效。 2021-09-29 10:15:00 鸿蒙HarmonyOS应用 一篇文章带你了解Go语言基础之变量 简单点说,我们写的程序默认数据都是保存在内存条中的,我们不可能直接通过地址找到这个变量,因为地址太长了,而且不容易记。 2021-09-29 10:00:07 Go语言基础 Android高手进阶之ViewDragHelper使用详解以及拖动上下滑卡片实现 今天我们就来讲解下ViewDragHelper;ViewDragHelper是针对 ViewGroup 中的拖拽和重新定位 views 操作时提供了一系列非常有用的方法和状态追踪。 2021-09-29 09:42:32 AndroidViewDragHel拖动上下滑卡片 用 Python 分析资产收益的典型化事实 在本节中,我们将用 Python去发现标准普尔 500 指数系列中的五个典型化事实。 2021-09-29 09:35:29 Python典型化事实代码 Go 什么时候会触发 GC? Go 语言作为一门新语言,在早期经常遭到唾弃的就是在垃圾回收(下称:GC)机制中 STW(Stop-The-World)的时间过长。 2021-09-29 09:24:21 GCGo STW 分布式事务知识小结 PC 和 3PC 是一种强一致性事务,不过还是有数据不一致,阻塞等风险,而且只能用在数据库层面。 2021-09-29 09:07:37 分布式架构系统 JetBrains 公开 2021 年开发者生态系统调查的原始数据 此前,本站报道了 JetBrains 的第五次年度开发者生态系统调查结果,现在,JetBrains 公布了此次调查的原始数据。

自顶向下的比较每个节点的左右子树的最大高度差,如果二叉树中每个节点的左右子树最大高度差小于等于 1 ,即每个子树都平衡时,此时二叉树才是平衡二叉树.

[[426529]]

本文转载自微信公众号「三分钟学前端」,作者sisterAn 。转载本文请联系三分钟学前端公众号。

关于树基础看这里:适合初学者的树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

  1. 3
  2. /\
  3. 920
  4. /\
  5. 157

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

  1. 1
  2. /\
  3. 22
  4. /\
  5. 33
  6. /\
  7. 44

返回 false 。

解答一:自顶向下(暴力法)

解题思路: 自顶向下的比较每个节点的左右子树的最大高度差,如果二叉树中每个节点的左右子树最大高度差小于等于 1 ,即每个子树都平衡时,此时二叉树才是平衡二叉树

代码实现:

  1. constisBalanced=function(root){
  2. if(!root)returntrue
  3. returnMath.abs(depth(root.left)-depth(root.right))<=1
  4. &&isBalanced(root.left)
  5. &&isBalanced(root.right)
  6. }
  7. constdepth=function(node){
  8. if(!node)return-1
  9. return1+Math.max(depth(node.left),depth(node.right))
  10. }

复杂度分析:

  • 时间复杂度:O(nlogn),计算 depth 存在大量冗余操作
  • 空间复杂度:O(n)

解答二:自底向上(优化)

解题思路: 利用后续遍历二叉树(左右根),从底至顶返回子树最大高度,判定每个子树是不是平衡树 ,如果平衡,则使用它们的高度判断父节点是否平衡,并计算父节点的高度,如果不平衡,返回 -1 。

遍历比较二叉树每个节点 的左右子树深度:

  • 比较左右子树的深度,若差值大于 1 则返回一个标记 -1 ,表示当前子树不平衡
  • 左右子树有一个不是平衡的,或左右子树差值大于 1 ,则二叉树不平衡
  • 若左右子树平衡,返回当前树的深度(左右子树的深度最大值 +1 )

代码实现:

  1. constisBalanced=function(root){
  2. returnbalanced(root)!==-1
  3. };
  4. constbalanced=function(node){
  5. if(!node)return0
  6. constleft=balanced(node.left)
  7. constright=balanced(node.right)
  8. if(left===-1||right===-1||Math.abs(left-right)>1){
  9. return-1
  10. }
  11. returnMath.max(left,right)+1
  12. }

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月5日 18:25
下一篇 2023年5月5日 18:25

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信