当前位置: 首页 > article >正文

学习记录:js算法(四十六):平衡二叉树

文章目录

    • 平衡二叉树
      • 我的思路
      • 网上思路
    • 总结

平衡二叉树

给定一个二叉树,判断它是否是 平衡二叉树

图一
在这里插入图片描述
图二
在这里插入图片描述

示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:
输入:root = []
输出:true

我的思路
递归
网上思路

我的思路

var isBalanced = function (root) {
    function checkBalance(node) {
        if (!node) return 0;
        const leftHeight = checkBalance(node.left);
        if (leftHeight === -1) return -1;
        const rightHeight = checkBalance(node.right);
        if (rightHeight === -1) return -1;
        if (Math.abs(leftHeight - rightHeight) > 1) {
            return -1;
        }
        return Math.max(leftHeight, rightHeight) + 1;
    }
    return checkBalance(root) !== -1;
};

讲解

  1. isBalanced 函数: 主函数,用于判断是否平衡。
  2. checkBalance 函数: 辅助函数,递归检查每个节点的左右子树高度差。
    • 如果节点为空,返回高度 0
    • 递归计算左子树和右子树的高度。
    • 如果发现任何子树不平衡,返回 -1
    • 如果当前节点的左右子树高度差大于 1,也返回 -1
    • 否则,返回当前节点的高度。
  3. 如果 checkBalance 返回值不是 -1,说明树是平衡的。

网上思路

var isBalanced = function (root) {
  if (root == null) return true;
  const depth = (root) => {
    if (root == null) return 0;
    return Math.max(depth(root.left), depth(root.right)) + 1;
  };
  return (
    Math.abs(depth(root.left) - depth(root.right)) < 2 &&
    isBalanced(root.left) &&
    isBalanced(root.right)
  );
};

讲解

  1. 函数定义:
    定义一个名为 isBalanced 的函数,接受一个参数 root,表示二叉树的根节点。
  2. 基准条件:
    如果树的根节点为空,返回 true,因为空树被认为是平衡的。
  3. 深度计算函数:
    • 定义一个名为 depth 的递归函数,用于计算树的高度。
    • if (root == null) return 0: 如果当前节点为空,返回高度 0
    • return Math.max(depth(root.left), depth(root.right)) + 1:递归调用 depth 函数来计算左子树和右子树的高度,取较大值并加 1,以计算当前节点的高度。
  4. 平衡性检查:
    通过逻辑与运算符 && 来检查以下条件
    • Math.abs(depth(root.left) - depth(root.right)) < 2:检查当前节点的左右子树高度差是否小于 2。如果高度差大于或等于 2,说明当前节点不平衡。
    • isBalanced(root.left):递归检查左子树是否平衡。
    • isBalanced(root.right): 递归检查右子树是否平衡。

总结

递归好用


http://www.kler.cn/a/322093.html

相关文章:

  • 利用 IDEA 快速管理 k8s 集群
  • C++之STL—常用算术生成算法
  • Android系统:系统架构
  • 【入门01】arcgis api 4.x 创建地图、添加图层、添加指北针、比例尺、图例、卷帘、图层控制、家控件(附完整源码)
  • 跳表的理解以及使用
  • 饿了么 ui表单 有滚动条的时候 右上角多一节
  • 网络安全的方方面面
  • 第二十二节:学习拦截器使用方法(自学Spring boot 3.x的第六天)
  • zookeeper面试题
  • C++模拟实现list:list、list类的初始化和尾插、list的迭代器的基本实现、list的完整实现、测试、整个list类等的介绍
  • 缓存的思考与总结
  • mysql默认隔离级别为什么要设置为RC?
  • AI视频技术:引领影视剧拍摄的未来
  • Innodb存储架构
  • 【Redis】分布式锁之 Redission
  • 【Pytorch】大语言模型中的CrossEntropyLoss
  • Node.js官网无法正常访问时安装NodeJS的方法
  • Pencils Protocol 即将登录各大 CEX,依旧看好 $DAPP
  • [教程]如何在iPhone上启用中国移动/联通/电信RCS消息
  • 国产sql工具何时才能出头?