自平衡二叉查找树_二叉树后序遍历怎么看

自平衡二叉查找树_二叉树后序遍历怎么看这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战 【LeetCode 110.平衡二叉树】两种递归实现:自顶向下、自底向上 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【LeetCode 110.平衡二叉树】两种递归实现:自顶向下、自底向上

题目描述

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

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。

解法 1:自顶向下

根绝平衡二叉树的定义,可以递归比较每个节点的左右子树的高度差,是否超过 1。如果所有节点都满足条件,那么就是一棵平衡二叉树;否则,不是一棵平衡二叉树。

代码实现如下:

var isBalanced = function(root) {
  if (!root) return true;
  return (
    isBalanced(root.left) &&
    isBalanced(root.right) &&
    Math.abs(maxDepth(root.left) - maxDepth(root.right)) <= 1
  );
};

/** * 获取二叉树的高度 * @param {TreeNode} root * @return {number} */
function maxDepth(root) {
  if (!root) return 0;
  return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
解法 2: 自底向上(推荐)

你可能已经发现解法 1 的问题了:每个节点的高度值都会被重复计算。这带来了额外的时间消耗。那么如何避免这些重复计算呢?

解决思路是:先计算左右子树是否是平衡二叉树,并且计算、保存左右子树的高度,那么当前二叉树的高度可以通过左右子树的高度直接计算出来。

在 JavaScript 中,想要保存过程中的计算结果非常简单:可以通过传递一个对象作为参数,其上有属性 depth,表示以当前节点为根节点的二叉树的高度。


var isBalanced = function(root, obj = {}) {
  if (!root) {
    obj.depth = 0;
    return true;
  }

  const left = {}; // 左子树信息
  const right = {}; // 右子树信息
  if (isBalanced(root.left, left) && isBalanced(root.right, right)) {
    if (Math.abs(left.depth - right.depth) > 1) {
      // 检查左右子树高度差
      return false;
    }

    obj.depth = Math.max(left.depth, right.depth) + 1; // 当前二叉树的高度
    return true;
  } else {
    return false;
  }
};

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13730.html

(0)

相关推荐

  • html5 阅读器_微信打字自动生成图片

    html5 阅读器_微信打字自动生成图片最近公司微信公众号想使用 Apple 式的圆角阴影卡片做文章推荐。这种效果用 Adobe XD 可以轻松做出来,但是没法要求所有编辑都去学习新软件,所以就打算用前端实现一个小工具。效果如下: 更新: 已增加 Electron,可打包成 dmg 或 exe 文件运行。详见 Git…

    2023-08-07
    121
  • redis持久化rdb和aof_国学教育赵强

    redis持久化rdb和aof_国学教育赵强Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。 AOF (Append-only file…

    2023-04-04
    158
  • 关于python史上最全开发总结的信息

    关于python史上最全开发总结的信息学习python主要是自学或者报班学习的方式,但不建议自学。

    2023-11-01
    144
  • MySql第二天「建议收藏」

    MySql第二天「建议收藏」2022-09-04 MySQL常用的命令: 1、进入MySQL的命令: mysql -uroot -p; 说明:-uroot是指以root方式进行登陆MySQL。之后输入设置的SQL密码。 2、查询

    2023-06-03
    133
  • 聊聊flink的ParallelIteratorInputFormat

    聊聊flink的ParallelIteratorInputFormat序本文主要研究一下flink的ParallelIteratorInputFormat实例这里使用ExecutionEnvironment的generateSequence方法创建了带NumberSeq

    2023-08-20
    158
  • MySQL中MVCC的正确打开方式[通俗易懂]

    MySQL中MVCC的正确打开方式[通俗易懂]最近在学习MySQL中的MVCC,看了网上的各种版本,什么创建版本号、删除版本号,一开始看的时候,好像很对的样子,但实际上很多都是错误的。经过好几天的查阅对比,在几篇博客的帮助下,才算是觉得正确理解…

    2023-03-10
    129
  • go基础2 – 常量指针&数组-切片-map-nil

    go基础2 – 常量指针&数组-切片-map-nil常量指针 常量 关键词const定义,只能是数字型(整数,浮点,复数)、字符串型、布尔型 用于存储不会改变的数据,常量编译时被创建。常量表达式必须为能被编译器求值的常量表达式 Iota常量生成器 在第

    2023-11-13
    123
  • Python使用with open实现文件操作

    Python使用with open实现文件操作Python中使用文件操作十分方便,通过打开文件、读取文件、写入文件及关闭文件等一系列操作,可以轻松地在Python中实现文件操作。with open语句是Python文件操作中的一种常用方法,它可以自动帮助我们关闭文件,避免频繁地使用close()方法而导致程序出错。

    2024-02-02
    97

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注