LeetCode题练习与总结:平衡二叉树--110

一、题目描述

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

示例 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] 内
  • -10^4 <= Node.val <= 10^4

二、解题思路

平衡二叉树是指任何节点的两个子树的高度差不超过1的二叉树。我们可以使用后序遍历的方式来解决这个问题,具体步骤如下:

  1. 对于二叉树的每一个节点,我们都需要计算它的左子树和右子树的高度。
  2. 如果当前节点的左子树和右子树的高度差大于1,则这个二叉树不是平衡二叉树,直接返回false。
  3. 如果当前节点的左子树或右子树不是平衡二叉树,则整个二叉树也不是平衡二叉树,直接返回false。
  4. 如果所有节点都满足平衡二叉树的条件,则返回true。

三、具体代码

class Solution {public boolean isBalanced(TreeNode root) {if (root == null) {return true;}// 计算左子树的高度int leftHeight = treeHeight(root.left);// 计算右子树的高度int rightHeight = treeHeight(root.right);// 如果当前节点的左子树和右子树的高度差大于1,则这个二叉树不是平衡二叉树if (Math.abs(leftHeight - rightHeight) > 1) {return false;}// 递归判断左子树和右子树是否是平衡二叉树return isBalanced(root.left) && isBalanced(root.right);}// 计算二叉树的高度private int treeHeight(TreeNode root) {if (root == null) {return 0;}// 计算左子树的高度int leftHeight = treeHeight(root.left);// 计算右子树的高度int rightHeight = treeHeight(root.right);// 返回当前节点的高度return Math.max(leftHeight, rightHeight) + 1;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 计算单个节点高度的时间复杂度: 对于每个节点,我们需要计算其左右子树的高度。这是一个递归过程,每次递归都会涉及到访问节点的左右子节点。因此,对于每个节点,我们都需要进行一次递归调用,其时间复杂度为 O(1)。

  • 计算整棵树高度的时间复杂度: 在最坏的情况下,树是一个高度不平衡的线性链(即每个节点都只有一个子节点),这时计算高度的递归函数会被调用 n 次(n 是树中节点的数量)。因此,计算整棵树高度的时间复杂度是 O(n)。

  • 判断平衡二叉树的时间复杂度: 判断平衡二叉树的过程也是一个递归过程,它会遍历树中的每个节点,并且每次都会调用计算高度的递归函数。因此,总的时间复杂度是 O(n) * O(n) = O(n^2)。

  • 综上所述,代码的时间复杂度是 O(n^2)。

2. 空间复杂度
  • 计算单个节点高度的空间复杂度: 空间复杂度主要取决于递归调用栈的深度,这在最坏的情况下与树的高度相同。因此,对于单个节点的空间复杂度是 O(h),其中 h 是树的高度。

  • 计算整棵树高度的空间复杂度: 由于我们需要对每个节点进行一次递归调用,所以整棵树高度的空间复杂度是 O(n) * O(h) = O(n * h),其中 n 是树中节点的数量,h 是树的高度。

  • 判断平衡二叉树的空间复杂度: 判断平衡二叉树的空间复杂度同样取决于递归调用栈的深度,最坏情况下与树的高度相同。因此,总的空间复杂度是 O(h)。

  • 综上所述,代码的空间复杂度是 O(h),在最坏情况下是 O(n)。

五、总结知识点

  1. 递归:这是一种常用的算法设计技巧,用于解决分而治之的问题。在这个问题中,我们使用递归函数来遍历二叉树的每个节点,并计算子树的高度。

  2. 二叉树遍历:代码中使用的是后序遍历(左-右-根)的方式来访问二叉树的节点。这种遍历方式适合于需要先处理子节点再处理父节点的情况。

  3. 二叉树的高度:二叉树的高度是从根节点到最远叶子节点的最长路径上的节点数。这个概念在判断平衡二叉树时非常重要。

  4. 绝对值Math.abs() 函数用于计算一个数的绝对值,在这里用于计算左右子树高度差值的绝对值,以判断是否超过了1。

  5. 逻辑与操作符(&&):用于连接两个布尔表达式,只有当两个表达式都为真时,整个表达式才为真。在代码中,用于判断左右子树是否都是平衡的。

  6. 私有函数treeHeight 函数被标记为 private,这意味着它只能在同一个类中被访问,这是封装的一种形式。

  7. 递归基:在 treeHeight 函数中,当遇到空节点时,返回高度为0,这是递归的基 case,用于终止递归。

  8. 函数调用栈:递归函数使用系统栈来存储每一层递归的信息。在递归过程中,每进入一层递归,就会有一个新的函数帧被压入栈中,当递归基被触发时,这些帧会依次弹出。

  9. 树的结构:代码中使用了 TreeNode 类来表示树的节点,这是二叉树数据结构的基本表示方法。

  10. Math.max() 函数:用于返回两个值中的最大值,在这里用于计算当前节点的高度,即左右子树高度的最大值加1。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java用法】java中计算两个时间差

java中计算两个时间差 不多说&#xff0c;直接上代码&#xff0c;可自行查看示例 package org.example.calc;import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit;public class MinusTest {public static void…

97.网络游戏逆向分析与漏洞攻防-ui界面的设计-通过逆向分析确认角色信息

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

分享几个PHP的webshell免杀思路

前言&#xff1a;网上的免杀思路有不少&#xff0c;不过大部分是基于混淆和加密的&#xff0c;我这里分享两个基于匿名函数、变量覆盖和反序列化的webshell思路&#xff0c;思路来源于深信服EDR的RCE漏洞。 ps&#xff1a;远程获取的时候&#xff0c;其实也可以用fopen读取远程…

WAMP无法启动mysql

一种原因是原来安装过mysql,mysql默认是自启动的&#xff0c;而WAMP内置mysql会发生冲突&#xff0c;所以 解决方法&#xff1a; winR 输入 services.msc 将mysql关闭&#xff0c;并设为手动模式

Khoj:开源个人AI助手能连接你的在线和本地文档充当你的第二大脑

项目简介 Khoj是一个开源的、个人化的AI助手&#xff0c;旨在充当你的第二大脑。它能够帮助你回答任何问题&#xff0c;不论这些问题是在线上的还是在你自己的笔记中。Khoi 支持使用在线AI模型(例如 GPT-4)或私有、本地的语言模型(例如 Llama3)。你可以选择自托管 Khoj&#x…

AlexNet,LeNet-5,ResNet,VGG-19,VGG-16模型

模型 AlexNet导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映射字典&#xff1a;加载图像数据和对应的标签&#xff1a;构建AlexNet模型&#xff1a;编译模型&#xff1a;训练模型&#xff1a; LeNet-5导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映…

.net8.0与halcon编程环境构建

1.安装vs2022 2.安装h-12.0.exe ,不要勾选复选框 3.vs2022新建wpf应用程序 4.依赖项添加项目应用,选择halcondotnet.dll 5.安装System.Drawing 安装 HalconDotNet 安装 Rti.HDevEngineDotNet 在工具箱 空白处右键 应用halcon.dll WPF控件也应用halcon.dll 6.xaml申明hal…

5款ai文案自动生成器,让你写作爆款文案不犯难!

现如今&#xff0c;无论是用于社交媒体、广告宣传、网站内容还是其他各种领域&#xff0c;优秀的文案都能吸引更多的关注和流量。但是&#xff0c;对于许多创作者来说&#xff0c;想要创作出高质量的文案并非易事&#xff0c;常常会面临灵感枯竭、思路卡顿等问题。而现在有了一…

raid配置与实战

一、raid理论 1、raid概述 raid&#xff08;磁盘阵列&#xff09;&#xff1a;是用不同的硬盘分区&#xff0c;组成一个逻辑上的硬盘&#xff0c;高可用&#xff08;冗余&#xff09;。 2、raid级别 2.1、raid0条带化存储 数据分散在多个物理磁盘上的存储方式&#xff0c;…

如何解压忘记了密码的加密zip压缩包?这两个方法收藏好!

加密是一种保护信息不被未经授权访问的重要手段。ZIP压缩包作为一种常见的文件压缩格式&#xff0c;zip文件加密是很多人都回去做的一件事情&#xff0c;那么zip加密文件如何解密&#xff1f;有几种方法可以解密呢&#xff1f;今天介绍几种方法给大家。 一、尝试常用密码 我们…

SAP实施方法论

SAP新实施方法论 RDS Activate

大摩“凑热闹”:当前氧化铝紧平衡,任何供给冲击都将导致价格急剧波动

大摩认为&#xff0c;全球有590万吨氧化铝供应受阻&#xff0c;相等于扣除中国后全球供应约一成&#xff0c;而氧化铝需求可能有所上升&#xff0c;同时氧化铝库存缓冲有限&#xff0c;因此任何供给冲击都将导致价格急剧波动。 文章内容 今年以来氧化铝期货价格一路上行&#…

Thingsboard规则链:Customer Attributes节点详解

在物联网(IoT)平台Thingsboard的规则引擎中&#xff0c;Customer Attributes节点扮演了至关重要的角色&#xff0c;它允许用户访问和操作与客户&#xff08;Customer&#xff09;实体相关的属性数据。这些属性可以是静态信息&#xff0c;如客户名称、联系信息&#xff0c;或是动…

FreeRTOS学习笔记-基于stm32(7)任务状态查询与任务时间统计API函数

1、FreeRTOS任务相关API函数 函数描述uxTaskPriorityGet()查询某个任务的优先级vTaskPrioritySet()改变某个任务的任务优先级uxTaskGetSystemState()获取系统中任务状态vTaskGetInfo()获取某个任务信息xTaskGetApplicationTaskTag()获取某个任务的标签(Tag)值xTaskGetCurrentT…

spring分析工具_springboot startup analyze的部署和使用

工具是开源工具 ,可以放心使用 我是从开源中国OCSChina看到的顺便安利一下 部署 教程 https://github.com/linyimin0812/spring-startup-analyzer 直接下载地址 https://github.com/linyimin0812/spring-startup-analyzer/releases/download/v3.0.0/spring-startup-analyzer.…

Javaweb基础之Filter

大家好&#xff0c;这里是教授.F 引入&#xff1a; 为什么需要过滤器&#xff1f;&#xff1f;&#xff1f;我们在访问一个项目的时候&#xff0c;常常有很多页面&#xff0c;如果没有过滤器&#xff0c;则我们需要在用户访问一个页面的时候&#xff0c;都要进行一个校验&…

文心智能体平台:快来创建你的Java学习小助理,全方位辅助学习

文章目录 一、文心智能体平台1.1平台介绍1.2智能体介绍 二、智能体创建三、体验与总结 一、文心智能体平台 文心智能体平台是百度推出的基于文心大模型的智能体&#xff08;Agent&#xff09;平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类…

3D模型三角面转四角面操作指南---模大狮模型网

在3D建模的过程中&#xff0c;三角面(Triangles)和四角面(Quads)是两种常见的多边形类型。虽然三角面在渲染速度和计算效率上有其优势&#xff0c;但四角面在模型编辑和纹理映射上通常更为方便。因此&#xff0c;将三角面转换为四角面是建模过程中常见的需求。 一、选择合适的建…

【数值计算方法】雅可比解线性方程

废话少说&#xff0c;直接上干货。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define MaxSize 100 double A[MaxSize][MaxSize]; //系数矩阵 double B[MaxSize]; //系数矩阵 double C[MaxSize][MaxSize]; //去对角线矩阵 double …

window自动启动bat文件

开机自动开启远程桌面&#xff0c; WinR 执行netplwiz 命令进入设置&#xff1b;取消勾选&#xff0c;可选择所需用户&#xff0c;点击应用&#xff0c;输入远程的密码即可 开机自动开启远程桌面&#xff0c; WinR 执行netplwiz 命令进入设置&#xff1b;取消勾选&#xff0…