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

【算法】平衡二叉树

难度:简单

题目

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

示例:

示例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

提示:
● 树中的节点数在范围 [0, 5000] 内
● -104 <= Node.val <= 104

解题思路:

暴力解判断一棵二叉树是否是平衡二叉树,我们需要理解“平衡”的定义:对于树中的任意节点,它的左子树和右子树的高度差不超过1。这个问题可以通过自底向上递归的方式来解决,每个递归函数返回两个值:当前子树是否平衡以及该子树的高度。

  1. 定义递归函数:编写一个递归函数,该函数接收一个树节点作为参数。这个函数需要返回两个值:
    ○ 一个布尔值,表示以该节点为根的子树是否平衡。
    ○ 一个整数,表示以该节点为根的子树的高度。
  2. 基本情况
    ○ 如果节点为空,可以直接返回“平衡”状态(true)以及高度0,因为空树被认为是平衡的。
  3. 递归计算
    ○ 对当前节点的左子树进行递归调用,得到左子树是否平衡及高度。
    ○ 对当前节点的右子树进行递归调用,得到右子树是否平衡及高度。
  4. 判断并返回
    ○ 根据左、右子树的平衡状态和高度,判断当前节点的子树是否平衡:
    ■ 如果左、右子树都平衡且它们的高度差不超过1,则当前子树平衡。
    ■ 否则,当前子树不平衡。
    ○ 计算当前子树的高度,即左右子树高度中的较大者加1。
  5. 主函数调用:从根节点开始调用递归函数,仅关心返回的平衡状态,忽略高度信息。
JavaScript实现:
// 定义二叉树节点
class TreeNode {constructor(val, left = null, right = null) {this.val = val;this.left = left;this.right = right;}
}// 判断是否平衡的递归函数
function isBalancedHelper(node) {if (!node) return [true, 0]; // 空树,高度为0,平衡const [leftBalanced, leftHeight] = isBalancedHelper(node.left);const [rightBalanced, rightHeight] = isBalancedHelper(node.right);// 当前节点是否平衡的判断依据const balanced = leftBalanced && rightBalanced && Math.abs(leftHeight - rightHeight) <= 1;// 当前子树的高度const height = Math.max(leftHeight, rightHeight) + 1;return [balanced, height];
}// 主函数
function isBalanced(root) {return isBalancedHelper(root)[0]; // 只关心是否平衡的结果
}// 示例
//const root = new TreeNode(1,
//     new TreeNode(2,
//         new TreeNode(3),
//         new TreeNode(4)),
//     new TreeNode(2));
// console.log(isBalanced(root)); // 输出: false,因为右子树的左子树高度为2,导致不平衡

这段代码首先定义了二叉树节点的构造函数TreeNode,然后定义了辅助递归函数isBalancedHelper来判断子树的平衡状态和计算高度,最后是主函数isBalanced来调用辅助函数并返回是否平衡的结果。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【CUDA|CUDNN】安装
  • CANoe:为什么两个VLAN接口不能设置同一个网络的IP地址呢?
  • Django 常见的操作符
  • 修复 Ubuntu 24.04 Dock 丢失应用程序图标
  • 数据结构--二叉树相关习题5(判断二叉树是否是完全二叉树 )
  • uniapp如何发送websocket请求
  • Python函数 之 变量
  • 前端导出pdf
  • Science Advances 仿生双模态触觉感知
  • c++ 多边形 xyz 数据 获取 中心点方法,线的中心点取中心值搞定 已解决
  • PMON的解读和开发
  • java通过poi-tl导出word实战详细步骤
  • 视频使用操作说明书-T80005系列视频编码器如何对接海康NVR硬盘录像机,包括T80005系列高清HDMI编码器、4K超高清HDMI编码器
  • git diff,stash,submodule,format-patch
  • 自定义波形图View,LayoutInflater动态加载控件保存为本地图片
  • [笔记] php常见简单功能及函数
  • 「译」Node.js Streams 基础
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【笔记】你不知道的JS读书笔记——Promise
  • 〔开发系列〕一次关于小程序开发的深度总结
  • AWS实战 - 利用IAM对S3做访问控制
  • css属性的继承、初识值、计算值、当前值、应用值
  • echarts花样作死的坑
  • happypack两次报错的问题
  • JAVA_NIO系列——Channel和Buffer详解
  • mysql常用命令汇总
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React中的“虫洞”——Context
  • Spring Boot快速入门(一):Hello Spring Boot
  • webpack4 一点通
  • 第2章 网络文档
  • 动态规划入门(以爬楼梯为例)
  • 给第三方使用接口的 URL 签名实现
  • 工作中总结前端开发流程--vue项目
  • 观察者模式实现非直接耦合
  • 力扣(LeetCode)22
  • 让你的分享飞起来——极光推出社会化分享组件
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 通过npm或yarn自动生成vue组件
  • 阿里云移动端播放器高级功能介绍
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #Ubuntu(修改root信息)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • %check_box% in rails :coditions={:has_many , :through}
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (39)STM32——FLASH闪存
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Qt) 默认QtWidget应用包含什么?
  • (第二周)效能测试
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (回溯) LeetCode 40. 组合总和II