【二叉树算法题记录】110. 平衡二叉树

ops/2024/10/19 2:26:24/

题目描述

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

什么是平衡二叉树?一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1

题目分析

其实平衡二叉树的定义就给出了递归的思路:每个节点的左右两个子树的高度差的绝对值不超过1。那么我们递归从下往上计算每个节点左右子树的高度差,并进行判断就好了。显而易见,我们这里是后序遍历,因为要先计算左右子树,然后把左右子树的情况传给当前根节点,依此向上传递。

  1. 首先确定函数返回值及参数:我们需要计算左右子树高度,那么就需要传回int类型值。但是当发现左右子树不是平衡二叉树时,我们其实可以不用再向上计算了,因为这棵树必定就不是平衡二叉树了。那么我们可以设定返回值为-1时,能判定以当前节点为根节点的子树不是平衡二叉树
  2. 递归终止条件:当节点没有左右子树了,即遍历到叶子节点时,我们就直接返回叶子节点的高度,也就是0;
  3. 每层递归的逻辑:按照后序遍历的方法,也就是左-右-中。但这里需要注意,我们每遍历完一个左子树或右子树,都要判断它是不是平衡二叉树,也即返回值是否为-1,如果是-1,那就直接向上层递归返回-1即可。

整体代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int compare(TreeNode* root){// 递归计算并判断每个节点左子树右子树的高度差// 递归终止条件if(root==NULL) return 0;// 设置返回值-1说明左右子树不平衡// 后序遍历int leftHeight = compare(root->left);if(leftHeight == -1) return -1;int rightHeight = compare(root->right);if(rightHeight == -1) return -1;if(abs(leftHeight-rightHeight) > 1) return -1;return 1 + max(leftHeight, rightHeight);}bool isBalanced(TreeNode* root) {int result = compare(root);if(result == -1) return false;else return true;}
};

http://www.ppmy.cn/ops/36857.html

相关文章

今日头条,抖音,西瓜视频你不知道的秘密?

西瓜视频和抖音这两款产品是一家,都是由今日头条孵化。 抖音是由今日头条孵化的一款音乐创意短视频社交软件,该软件于2016年9月20日上线,是一个面向全年龄的音乐短视频社区平台。用户可以通过这款软件选择歌曲,拍摄音乐短视频&am…

什么是虚拟货币?

随着科技的进步,虚拟货币逐渐进入公众视野,其影响深远且复杂。本文将从专业角度分析虚拟货币的发展现状、未来趋势,以及面临的挑战,并尝试提出一些思考。 一、虚拟货币的定义与现状 虚拟货币是一种基于区块链技术的数字资产&…

《Effective Java》如果说我需要一本Java编程的书,那就是它了

《Effective Java》 编写出更优雅的Java代码作者简介斩获Jolt图书大奖本文福利 编写出更优雅的Java代码 《Effective Java》是Java编程领域的一本经典之作,由Joshua Bloch撰写,旨在帮助Java程序员提高编码技巧,写出更加健壮、高效和易于维护的…

刷题《面试经典150题》(第九天)

加油! 学习目标:学习内容:学习时间:知识点学习内容:跳跃游戏 II - 力扣(LeetCode)H 指数 - 力扣(LeetCode)盛最多水的容器 - 力扣(LeetCode)矩阵置…

毕业就业信息|基于Springboot+vue的毕业就业信息管理系统的设计与实现(源码+数据库+文档)

毕业就业信息管理系统 目录 基于Springboot+vue的毕业就业信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1学生信息管理 2 公司信息管理 3公告类型管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设…

算法练习17——罗马数字转整数

LeetCode 13 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII …

imx6ull配置交叉编译环境编译u-boot及linux所遇问题解决记录

文章目录 前言一、问题 1 及解决方法1、问题 1 描述2、问题 1 解决方法 二、问题 2 及解决方法1、问题 2 描述2、问题 2 解决方法 三、问题 3 及解决方法1、问题 3 描述2、问题 3 解决方法 四、问题 4 及解决方法1、问题 4 描述2、问题 4 解决方法 前言 CoM-iMX6UL(L) 是一款兼…

重学SpringBoot3-SPI机制

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-SPI机制 什么是 SPI?Spring Boot 中的 SPI 机制spring.factories 文件自动配置的实现启动流程中的作用 SPI实际应用步骤 1: 新建模块步骤 2:…