平衡二叉树,力扣

目录

前序遍历与后续遍历

题目地址:

题目:

我们直接看题解吧:

审题目+事例+提示:

解题方法:

难度分析:

解题方法分析:

解题分析:

解题思路:

代码实现:

补充说明:

代码进一步优化:

代码实现(自顶向下) :


前序遍历与后序遍历

下面方法需要用,大家不太熟或者想加强一下可以先刷一下

二叉树的前序遍历,力扣-CSDN博客

二叉树的后序遍历,力扣-CSDN博客

题目地址:

110. 平衡二叉树 - 力扣(LeetCode)

难度:简单


乍一看以为有点难,其实仔细理解一下,发现还行,大家可以简单看一下解题思路,然后再照着代码看,会更容易理解一些。

今天刷平衡二叉树,大家有兴趣可以点上面链接,看看题目要求,试着做一下。

题目:

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

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

我们直接看题解吧:

审题目+事例+提示:

平衡二叉树的定义:

二叉树的每个节点的左右子树的高度差的绝对值不超过1。

   注:空树也可以作为平衡二叉树

 性质:当前树的深度等于左子树深度与右子树的深度中的最大值+1

解题方法:

根据定义可知,一棵若为平衡二叉树,当且仅当其所右子树也都是平衡二叉树,

因此可以用递归的方法。

方法1、自顶向下递归

方法2、自底向上递归

难度分析:

主要考察树及二叉树的相关基础,对于初学者来说,方法2需要打破思维限制可能难一点

解题方法分析:

方法1,我们可能比较容易想得到,但是它不是最优的。

简单说一下思路:

具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 1,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。

这是一个自顶向下的递归的过程。它最大的问题是会产生重复计算,对于同一个节点,用于计算二叉树高度的函数 height() 会被重复调用,导致时间复杂度较高。

但如果使用自底向上的做法,则对于每个节点,函数 height() 只会被调用一次,因此,下面着重讲一下方法2.

解题分析:

自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回−1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。

解题思路:

1、在函数isBalanced()中,调用height()参数为树根节点root,若最终返回值>=0,则说明此树平衡,即返回true,反之返回false。

2、创建用于计算二叉树高度的函数height(root)

               ·判断根节点是否为空,空则返回0

                ·分别递归调用函数height()获取当前节点左右子树的高度

                 `判断其左右子树高度是否为-1,或者左右子树绝对值之差大于1,满足则返回-1

                                                                                若不满足,则返回其左右子树最大值+1

代码实现:

class Solution {
    public boolean isBalanced(TreeNode root) {
        return height(root) >= 0;//若最终返回值不等于-1,则说明此树平衡,即返回true,反之返回 
                                  //                                               false。
    }

    public int height(TreeNode root) {//创建用于计算二叉树高度的函数height(root)
        if (root == null) {
            return 0;           //判断根节点是否为空,空则返回0
        }
        int leftHeight = height(root.left);//递归调用函数height()获取当前节点左子树的高度
        int rightHeight = height(root.right);//递归调用函数height()获取当前节点右子树的高度
        if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {     //判断其左右子树高度是否为-1,或者左右子树绝对值之差大于1
            return -1; //满足则返回-1
        } else {//若不满足,则返回其左右子树最大值+1
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
}

补充说明:

第一次调用函数时,若根节点为空,则整棵树为空树了 

代码进一步优化:

如果左子树已经返回-1了就不需要再递归右子树了,直接返回-1

class Solution {
    public boolean isBalanced(TreeNode root) {
        return balanced(root) != -1;
    }

    private int balanced(TreeNode node) {
        if (node == null) return 0;
        int leftHeight, rightHeight;
        if ((leftHeight = balanced(node.left)) == -1
                                     //如果左子树已经返回-1了就不需要再递归右子树了,直接返回-1
                || (rightHeight = balanced(node.right)) == -1
                || Math.abs(leftHeight - rightHeight) > 1)
            return -1;
        return Math.max(leftHeight, rightHeight) + 1;
    }
}

代码实现(自顶向下) :

class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        } else {
            return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
        }
    }

    public int height(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            return Math.max(height(root.left), height(root.right)) + 1;
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea 社区版 Database Navigator插件 列显示顺序错乱解决办法

idea 社区版 Database Navigator插件 列显示顺序错乱 影响&#xff1a;MyBatisCodeHelperPro插件生成代码字段顺序错乱 解决办法&#xff1a;将COLUMN 的排序方式由Name改为Position方式之后&#xff0c;reload即可&#xff01;

Spring Security 6.x 系列(14)—— 会话管理之源码分析

一、前言 在上篇 Spring Security 6.x 系列(13)—— 会话管理之会话概念及常用配置 Spring Security 6.x 系列(14)—— 会话管理之会话固定攻击防护及Session共享 中了清晰了协议和会话的概念、对 Spring Security 中的常用会话配置进行了说明,并了解会话固定攻击防护…

SCT52240Q双路 4A/4A 高速MOSFET/IGBT栅极驱动器, 可并联输出,替代UCC27524

• 4.5-24V宽供电电压 • 4A 峰值驱动拉电流和灌电流 • 双通道并联输出&#xff0c;增强驱动能力 • 低至-5V负压输入 • 支持TTL低压逻辑输入 • 13ns传输延迟 • 快速上升下降时间&#xff08;典型值8ns&#xff09; • 双通道1ns典型值延迟匹配时间 • 55uA静态功耗 • 输入…

巨杉数据库荣登2023胡润全球猎豹企业榜

胡润研究院与广州南沙联合发布《2023胡润全球猎豹企业榜》&#xff0c;这是胡润研究院首次发布“全球猎豹企业”。榜单列出了全球成立于2000年后&#xff0c;五年内最有可能达到独角兽级十亿美金估值的高成长性企业。巨杉数据库凭借在分布式文档型数据库领域的创新突破&#xf…

SpringMVC-视图

SpringMVC中的视图实现了View接口&#xff0c;作用是渲染数据&#xff0c;将Model中的数据展示给用户。render是渲染方法&#xff0c;可以看到渲染的视图是一个View类型的对象。 SpringMVC视图的种类有很多&#xff0c;默认有转发视图和重定向视图。 如果配置了Thymeleaf视图解…

Java 新手如何使用Spring MVC 中的查询字符串和查询参数

目录 前言 什么是查询字符串和查询参数&#xff1f; Spring MVC中的查询参数 处理可选参数 处理多个值 处理查询参数的默认值 处理查询字符串 示例&#xff1a;创建一个RESTful服务 总结 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家…

el-table表格动态添加列。多组数据拼接和多层级数据的处理

提示&#xff1a;el-table表格动态添加列 文章目录 前言一、多组数据拼接二、多层级处理三、实际应用中&#xff0c;为避免闪屏&#xff0c;可以表格数据统一渲染总结 前言 需求&#xff1a;富文本编辑器 一、多组数据拼接 <template><div class"test">…

WEB 3D技术 three.js 几何体uv属性讲解与基本演示

本文 我们来说说uv 那么 它是什么呢&#xff1f; 首先 比如 我们几何体 贴一个图 那么 为什么我们图的四个边就能正好贴到几何体的边 为什么不可以图就在几何体中间呢&#xff1f; 中心为什么能对齐 它就不能偏一点吗&#xff1f; 这是第一个问题 还有我们 gltf 这种文件 其实…

14:00面试,14:06就出来了,问的问题真的变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

分布式图文详解!

分布式理论 1. 说说CAP原则&#xff1f; CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;Consistency&#xff08;一致性&#xff09;、 Availability&#xff08;可用性&#xff09;、Partition tolerance&#xff08;分区容错性&#xff09;这3个基本…

springCould中的Hystrix【上】-从小白开始【7】

目录 1.简单介绍❤️❤️❤️ 2.主要功能 ❤️❤️❤️ 3.正确案例❤️❤️❤️ 4.使用jmeter压测 ❤️❤️❤️ 5.建模块 80❤️❤️❤️ 6.如何解决上面问题 ❤️❤️❤️ 7.对8001进行服务降级❤️❤️❤️ 8.对80进行服务降级 ❤️❤️❤️ 9.通用降级方法❤️❤️…

数据中台建设之路

数据中台是在政企数字化转型过程中&#xff0c;对各业务单元业务与数据的沉淀&#xff0c;构建包括数据技术、数据治理、数据运营等数据建设、管理、使用体系&#xff0c;实现数据赋能。数据中台&#xff0c;是新型信息化应用框架体系中的核心。 1、什么是数据中台 随着企业数…

被客户骂咋办?客服请看这些处理方式

客户骂人的常见类型 1.没来得及回复就辱骂 绝大多数客户都非常反感机器人自动回复。但人工回复需要一定的回复时间&#xff0c;如果自己打字速度不快&#xff0c;则建议搭配使用快捷回复软件(客服宝) 2.说我们服务态度不好 回复上可以多加一些感叹后缀词&#xff0c;如“好…

【GO语言卵细胞级别教程】01.GO基础知识

01.GO基础知识 目录 01.GO基础知识1.GO语言的发展历程2.发展历程3.Windowns安装4.VSCode配置5.基础语法5.1 第一段代码5.2 GO执行的流程5.3 语法规则5.4 代码风格5.5 学习网址 1.GO语言的发展历程 Go语言是谷歌公司于2007年开始开发的一种编程语言&#xff0c;由Robert Griese…

PTA——逆序的三位数

程序每次读入一个正3位数&#xff0c;然后输出按位逆序的数字。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如输入700&#xff0c;输出应该是7。 输入格式&#xff1a; 每个测试是一个3位的正整数。 输出格式&#xff1a; 输出按位逆序…

洛谷P1024[NOIP2001 提高组] 一元三次方程求解(cpp)(二分查找)

目录 1.题目 2.思路 3.AC 1.题目 # [NOIP2001 提高组] 一元三次方程求解 ## 题目描述 有形如&#xff1a; 这样的一个一元三次方程。给出该方程中各项的系数&#xff08;a,b,c,d 均为实数&#xff09;&#xff0c;并约定该方程存在三个不同实根&#xff08;根的范围在 -…

【每日论文阅读】单目深度估计 近期进展

红外场景单目深度估计的难点 缺乏准确的深度参考标准&#xff1a;红外场景下的深度估计通常需要依赖于大量的输入图像和对应的深度值作为训练的约束。然而&#xff0c;获取准确的深度参考标准是一个挑战&#xff0c;目前常用的方法是使用红外传感器&#xff08;如Kinect&#…

熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握

可用性的定义 在探讨高可用架构之前&#xff0c;让我们以 O2 系统为例&#xff0c;解释一下何谓可用性。O2 是腾讯内部的一个广告投放系统&#xff0c;专注于提升投放效率、分析广告效果&#xff0c;拥有自动化广告投放、AIGC 自动化素材生产等多种功能。 其整体架构概览如下&…

prometheus grafana redis安装配置监控

文章目录 前传安装redis-exporterredis_exporter参数配置参考配置prometheus查看promethues redis job节点grafana配置外传 前传 prometheus grafana的安装使用&#xff1a;https://nanxiang.blog.csdn.net/article/details/135384541 本文说下监控nginx&#xff0c;promethe…

T40N 君正智能处理器T40 BGA 芯片

T40N是一款智能视频应用处理器&#xff0c;适用于移动摄像机、安防等视频设备调查、视频聊天、视频分析等。该SoC引入了一种创新的体系结构满足高性能计算和高质量图像和视频编码的要求通过视频设备解决。T40N提供高速CPU计算能力&#xff0c;出色的图像信号过程中&#xff0c;…