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

news2024/10/4 20:38:39

一、题目描述

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

示例 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.coloradmin.cn/o/1714437.html

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

相关文章

第十三章 进程与线程

第十三章 进程与线程 程序与进程的概念 程序&#xff1a; 英文单词为Program&#xff0c;是指一系列有序指令的集合&#xff0c;使用编程语言所编写&#xff0c;用于实现一定的功能。 进程&#xff1a; 进程则是指启动后的程序&#xff0c;系统会为进程分配内存空间。 函数式…

汇编小习题

汇编你还想及格&#xff1f; 未完待续 1. 注释下面代码 Title Hello Word .386 ;使用80386指令集 .model flat, stdcall;内存模型为平坦模型&#xff0c;子程序采用stdcall约定 .stack 4096;为运行时堆栈分配4096空间 ExitProcess proto , dwExitCode:DWORD;为过程创建过程原…

超好用的加密工具

超好用的加密工具 背景 介于行业原因经常要对相关文件进行加密传输&#xff0c;尽可能避免文件的泄漏&#xff0c;保护群众的隐私。于是我就开发了一个非常好用的加密工具。 环境 本工具目前只适用 Windows 操作系统,最好是Windows8以上&#xff0c;否则需要下载额外的依赖…

门限签名技术

私钥永远不存在 (t, n) 门限签名方案 (TSS) 是一种密码协议&#xff0c;允许一组 n 个参与者共同签署文档或交易&#xff0c;其中 t 1 个或更多参与者的任何子集都可以产生有效签名&#xff0c;但 t 的子集 或更少的人不能。 该方案旨在通过确保没有任何一方可以单方面生成签名…

Paddle使用问题No module named ‘paddle.fluid’

这是Paddle版本的问题&#xff0c;从飞桨框架 2.5 版本开始&#xff0c;已经废弃了 paddle.fluid 。 ​解决方案&#xff1a;修改paddle版本 pip install paddlepaddle2.4.0

Prompt工程与实践

Prompt工程与实践 一、Prompt与大模型 1.1 大模型的定义 大模型本质上就是一个概率生成模型&#xff0c;该模型的模型参数足够大&#xff0c;并且在训练过程中阅读了非常多的各个领域的语料。这个时候&#xff0c;如果通过一个正确的、有效的指令去引导这个模型&#xff0c;…

算法-从归并排序到归并分治

文章目录 前言介绍1 . 简单的归并排序2 . 数组的最小和问题3 . 逆序数对问题4 . 翻转对数量的计算 前言介绍 归并排序是Merge sort&#xff09;是一种有效、稳定的排序算法&#xff0c;它采用了分治法&#xff08;Divide and Conquer&#xff09;的典型应用,何为分治 ? 即把多…

【Linux】Linux基本指令2

我们接着上一篇&#xff1a;http://t.csdnimg.cn/bSJx8 我们接着完善ls指令 我们可以直接匹配对应格式的文件匹配出来 1.man指令&#xff08;重要&#xff09;&#xff1a; Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助…

【贪心算法】C++解决回文串、增减字符串匹配、分发饼干、跳跃游戏、加油站问题

1. 前言 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优决策的算法。贪心算法通常用来解决最优化问题&#xff0c;其核心思想是通过局部最优解逐步推导出全局最优解。 在贪心算法中&#xff0c;我们并不总是考虑到未来可能发生的…

【PingPong_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

如何下载b站(哔哩哔哩bilibili)的学习视频教程

方法1&#xff1a; 打开粘贴视频链接下载即可哔哩哔哩(bilibili)视频解析下载 - 保存B站视频到手机、电脑哔哩哔哩高清视频解析下载工具是一个免费的B站视频在线解析提取工具,支持提取B站APP和bilibili网站上的任何视频,提取出来的视频无水印.我们可以借助此下载器方便地将视频…

使用jdk自带jhat工具排查OOM问题

使用jdk自带jhat工具排查OOM问题 OOM java.lang.OutOfMemoryError: Java heap space排查步骤 编写一个测试类 public class TestJVM {Testpublic void test1() throws InstantiationException, IllegalAccessException {List<A> list new ArrayList<>();for (i…

ArcGIS不同图斑设置不同的透明度

对于设置一个图层的整体的透明度&#xff0c;我们在 ArcGIS制作带蒙版的遥感影像地图http://mp.weixin.qq.com/s?__bizMzIzNjM2NTYxMg&mid2247509080&idx1&sn38dccf0a52bb3bb3758f57114ee38b72&chksme8da161bdfad9f0d363da90959a8524dcf2b60d0e8d999f8ebeef0…

OrangePi Alpro开箱体验 ubuntu 与 openEuler 实时性对比

OrangePi Alpro开箱体验 & ubuntu 与 openEuler 实时性对比 1 介绍1.1 概述1.2 OrangePi Kunpeng Pro vs OrangePi AIpro 2 开箱3 芯片介绍OrangePi AIpro(8T)Atlas 200I DK A2 4 开机连接鼠标、键盘、显示器桌面查看系统信息配置网络查看IP远程SSHWinSCP 5 GPIO Toolgpio_…

MATLAB分类与判别模型算法:基于LVQ神经网络的乳腺肿瘤诊断分类程序【含Matlab源码 MX_003期】

说明 实现基于LVQ&#xff08;Learning Vector Quantization&#xff0c;学习向量量化&#xff09;神经网络的乳腺肿瘤诊断分类任务。LVQ是一种监督学习算法&#xff0c;通常用于模式识别和分类任务。 算法思路介绍&#xff1a; 导入数据&#xff1a; 加载名为"data.mat&…

C++学习~~对于二进制文件的读写命名空间再认识异常处理

目录 1.将数据以二进制形式放到磁盘 2.将上述的数据读入内存并且显示在显示器上面 3.异常处理机制 4.抛出异常的应用实例 1.将数据以二进制形式放到磁盘 &#xff08;1&#xff09;使用student定义结构体数组stud,并对其进行初始化&#xff0c;创建输出文件流对象outfile,这…

朋友圈定时发送设置

人日常中不可缺少的一件事&#xff0c;同时也是企业用来触达客户的重要渠道&#xff0c;下面一起来了解下微信朋友圈怎么定时发送呢&#xff1f;

音乐传奇告别之作:《杰作》未解之谜❗❗

坂本龙一的《杰作》不仅是一部音乐会纪录电影&#xff0c;更是他赠予世界的一封深情告别信。 这部影片精心收录了这位音乐巨匠生前最后一场钢琴独奏音乐会的珍贵瞬间&#xff0c; 其中涵盖了《圣诞快乐&#xff0c;劳伦斯先生》、《末代皇帝》、《水》等二十首令人陶醉的经典…

设计模式20——职责链模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 职责链模式&#xff08;Chain …

手推车式电缆故障定位系统

武汉凯迪正大一体化电缆故障高压发生器用于测试各种型号的380V,600V,10kV,35kV,110kV,220kV,380kV电压等级的铜铝芯电力电缆、同轴通信电缆和市话电缆的各类故障&#xff0c;如电缆全长、开路、短路、断线、低阻故障、高阻故障、高阻泄露、高低阻抗接地、接地故障、铠装接地故障…