代码随想录二刷 | 二叉树 | 110.平衡二叉树

代码随想录二刷 | 二叉树 | 110.平衡二叉树

  • 题目描述
  • 解题思路
    • 递归
    • 迭代
  • 代码实现
    • 递归法
    • 迭代法

题目描述

110.平衡二叉树

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

本题中,一棵高度平衡二叉树定义为:

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

示例 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. 确定递归函数的参数和返回值
    参数:当前传入的节点
    返回值:因为求的是高度,所以为int

    如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。

    所以如果已经不是二叉平衡树了,可以返回 -1 来标记已经不符合平衡树的规则了。

    int getHeight(TreeNode* node)
    
  2. 确定终止条件
    遇到空节点时终止,返回0,表示当前节点为根节点的树高度为 0

    if (node == NULL) {return 0;
    }
    
  3. 确定单层递归的逻辑
    分别求出左右子树的高度,如果差值小于等于 1 ,则返回当前二叉树的高度,否则返回 -1,表示已经不是平衡二叉树了。

    int leftHeight = getHeight(node->left);
    if (leftHeight == -1) return -1;
    int rightHeight = getHeight(ndoe->right);
    if (rightHeight == -1) return -1;
    int result;
    if (abs(leftHeight - rightHeight) > 1) {result = -1;	
    } else {result = 1 + max(leftHeight, rightHeight);
    }
    return result;
    

迭代

本题的迭代方式可以先定义一个函数,专门用来求高度。

这个函数通过栈模拟的后序遍历找每一个节点的高度(其实是通过求传入节点为根节点的最大深度来求的高度)

// cur节点的最大深度,就是cur的高度
int getDepth(TreeNode* cur) {stack<TreeNode*> st;if (cur != NULL) st.push(cur);int depth = 0; int result = 0;while (!st.empty()) {TreeNode* node = st.top();if (node != NULL) {st.pop();st.push(node);st.push(NULL);depth++;if (node->right) st.push(node->right);if (node->left) st.push(node->left);} else {st.pop();node = st.top();st.pop();depth--;}result = result > depth ? result : depth;}return result;
}

然后再用栈来模拟后序遍历,遍历每一个节点的时候,再去判断左右孩子的高度是否符合,代码如下:

bool isBalanced(TreeNode* root) {stack<TreeNode*> st;if (root == NULL) return true;st.push(root);while (!st.empty()) {TreeNode* node = st.top();st.pop();if (abs(getDepth(node->left) - getDepth(node->right)) > 1) {return fasle;}if (node->right) st.push(node->right);if (node->left) st.push(node->left);}return true;
}

当然此题用迭代法,其实效率很低,因为没有很好的模拟回溯的过程,所以迭代法有很多重复的计算。

虽然理论上所有的递归都可以用迭代来实现,但是有的场景难度可能比较大。

例如:都知道回溯法其实就是递归,但是很少人用迭代的方式去实现回溯算法!

因为对于回溯算法已经是非常复杂的递归了,如果再用迭代的话,就是自己给自己找麻烦,效率也并不一定高。

代码实现

递归法

class Solution {
public:int getHeight(TreeNode* node) {if (node == NULL) return 0;int leftHeight = getHeight(node->left);if (leftHeight == -1) return -1;int rightHeight = getHeight(node->right);if (rightHeight == -1) return -1;return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftheight, rightHeight);}bool isBalanced(TreeNode* root) {return getHeight(root) == -1 ? false : true;}
};

迭代法

class Solution {
public:
class Solution {
private:int getDepth(TreeNode* cur) {stack<TreeNode*> st;if (cur != NULL) st.push(cur);int depth = 0; // 记录深度int result = 0;while (!st.empty()) {TreeNode* node = st.top();if (node != NULL) {st.pop();st.push(node);                          // 中st.push(NULL);depth++;if (node->right) st.push(node->right);  // 右if (node->left) st.push(node->left);    // 左} else {st.pop();node = st.top();st.pop();depth--;}result = result > depth ? result : depth;}return result;}public:bool isBalanced(TreeNode* root) {stack<TreeNode*> st;if (root == NULL) return true;st.push(root);while (!st.empty()) {TreeNode* node = st.top(); st.pop();if (abs(getDepth(node->left) - getDepth(node->right)) > 1) {return false;}if (node->right) st.push(node->right);           // 右(空节点不入栈)if (node->left) st.push(node->left);             // 左(空节点不入栈)}return true;}
};

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

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

相关文章

EMNLP 2023 获奖论文公布,大模型、NLP等领域火爆

EMNLP是计算语言学和自然语言处理领域顶级国际会议之一&#xff0c;属于CCF B类&#xff0c;是由 ACL 下属的SIGDAT小组主办的NLP领域顶级国际会议&#xff0c;一年举办一次。相较于ACL&#xff0c;EMNLP更偏向于NLP在各个领域解决方案的学术探讨。 今年的EMNLP 2023 已于2023…

table表格table/tr/td宽度和高度的设置

关于html中table表格tr,td的⾼度和宽度 做⽹页的时候经常会遇到各种各样的问题&#xff0c;经常遇到的⼀个就是会碰到表格被内容撑开的问题。 设置table样式为 table-layout: fixed; 宽度可以了&#xff0c;但是高度会被撑高。怎么设置都不行&#xff0c;只能给这个td标签单独…

【Linux】 线程池

线程池 什么是线程池&#xff1f; 一次预先申请一批线程&#xff0c;让这批线程有任务&#xff0c;就处理任务&#xff1b;没任务&#xff0c;就处于等待状态。 为什么要有线程池&#xff1f; 以空间换时间&#xff0c;预先申请一批线程&#xff0c;当有任务到来&#xff0c;可…

将rtsp视频流发送到AWS Kinesis Video Streams的方案——使用Gstreamer(C++) Command Line

大纲 1 创建Kinesis Video Streams1.1 创建视频流1.2 记录Creation Time 2 创建策略2.1 赋予权限2.2 限制资源2.3 Json格式描述&#xff08;或上面手工设置&#xff09;2.4 注意事项 3 创建IAM用户3.1 生成密钥对3.2 附加策略3.3 记录访问密钥对 4 编译C 创建者库5 发送6 检查参…

JavaScript <关于逆向RSA非对称加密算法的案例(代码剖析篇)>--案例(五点一)

引用上文: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/134857857 剖析: var bitsPerDigit16; // 每个数组元素可以表示的二进制位数// 数组复制函数&#xff0c;将源数组部分复制到目标数组的指定位置 function arrayCopy(src, srcStart, dest, destStart, n) {var m…

国内地址地区智能解析,无需完整地址也能正确匹配

页面直接引入使用 已打包成单文件dist/bundle.js 可以直接通过标签引用 <script src="./bundle.js"></script> <script>var results = AddressParse.parse(福建省福州市福清市石竹街道义明综合楼3F,15000000000,asseek);console.log(results);…

OD机考真题搜集:服务失效判断

题目 某系统中有众多服务,每个服务用字符串(只包含字母和数字,长度<=10)唯一标识,服务间可能有依赖关系,如A依赖B,则当B故障时导致A也故障。 依赖具有传递性,如A依赖B,B依赖C,当C故障时导致B故障,也导致A故障。 给出所有依赖关系,以及当前已知故障服务,要求输…

git提交代码报错Git: husky > pre-commit

目录 git提交代码报错原因解决方法&#xff08;三种&#xff09;1、第一种2、第二种3、第三种 git提交代码报错原因 这个问题是因为当你在终端输入git commit -m “XXX”,提交代码的时候,pre-commit(客户端)钩子&#xff0c;它会在Git键入提交信息前运行做代码风格检查。如果代…

Kotlin 中密封类、枚举类与密封接口的对比分析

在 Kotlin 编程语言中&#xff0c;密封类&#xff08;Sealed Classes&#xff09;、枚举类&#xff08;Enum Classes&#xff09;和密封接口&#xff08;Sealed Interfaces&#xff09;是处理一组固定类型的强大工具。它们在 Kotlin 中扮演着特殊的角色&#xff0c;特别是在创建…

【小白专用】MySQL创建数据库和创建数据表

1.在Windows开始搜索输入Mysql,并选择第一个打开。 2.输入安装时的密码 3.说明安装成功。 二、创建数据库 1. 连接 MySQL 输入 mysql -u root -p 命令&#xff0c;回车&#xff0c;然后输入 MySQL 的密码(不要忘记了密码)&#xff0c;再回车&#xff0c;就连接上 MySQL 了。 …

数据库常用锁

数据库锁是一种用于管理并发访问的机制&#xff0c;以确保数据的一致性和完整性。在并发访问的情况下&#xff0c;多个事务可能同时尝试访问相同的数据&#xff0c;而数据库锁能够协调这些访问&#xff0c;防止数据不一致的问题。以下是一些常见的数据库锁及其详细解释&#xf…

C语言-统计素数并求和

本题要求统计给定整数M和N区间内素数的个数并对它们求和。 输入格式: 输入在一行中给出两个正整数M和N&#xff08;1≤M≤N≤500&#xff09;。 输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和&#xff0c;数字间以空格分隔。 输入样例: 10 31输出样例: 7…

深入Redis过程-持久化

目录 redis实现持久化 RDB 触发机制-定期方法 定期-手动触发 save bgsave 定期-自动触发 AOF 开启AOF功能 刷新缓冲区策略 重写机制 混合持久化 Redis事务 事务相关的命令 MULTI EXEC DISCARD WATCH redis实现持久化 RDB RDB叫做Redis数据备份文件&#xf…

强大的公式编辑器 —— MathType最新版本安装与使用

强大的公式编辑器 —— MathType最新版本安装与使用 由于使用了很长时间的机械硬盘出现坏道&#xff0c;安装在其中的MathType6.9&#xff08;精简版&#xff09;也没办法使用了&#xff0c;本来想安装个高版本的MathType&#xff0c;比如MathType7.4&#xff0c;但在网上苦苦…

如何更改Jupyter Notebook中的环境?

1.首先&#xff0c;打开终端 2.接着&#xff0c;分别输入以下命令 conda env list 把EXPose替换为自己的环境变量 conda activate EXPose 3.接下来安装‘ ipykernel ’软件包 conda install ipykernel 4. 将该环境添加到Jupyter Notebook中&#xff1b;在Jupyter Notebook…

HTB Surveillance

Surveillance 2023年12月10日 12:13:35User nmap Starting Nmap 7.80 ( https://nmap.org ) at 2023-12-10 12:15 CST Stats: 0:00:37 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan Connect Scan Timing: About 59.83% done

小白第一次开私服怎么吸引玩家

大家好&#xff0c;我是咕噜-凯撒&#xff0c;在现在这个网络社会很多人为了放松一下会选择打打游戏&#xff0c;私服也就成为了许多玩家为了寻找新鲜体验的热门选择&#xff0c;很多小白就发现了这个契机但是吸引玩家加入自己的服务器也就成了一个比较头疼的问题&#xff0c;下…

Wrong number of values of control parameter 2(Halcon 错误代码:1402)

threshold (ImageReduced1, Region, 0,min2(75,Min)) 程序运行到这一句&#xff0c;出现错误 原因是其中的参数Min为空数组 解决方案&#xff1a;判断了下可以输出Min的区域是否存在&#xff0c;不存在跳过这一步。

八叉树bt文件转为grid文件的代码及编译流程

目的 点云文件转为八叉树文件 代码 在一个文件夹中新建两个文件&#xff0c;pcd2bt.cpp和CMakeLists.txt&#xff0c;分别写入&#xff1a; grid3d_node.cpp #include <ros/ros.h> #include <string> #include "grid3d.hpp"int main(int argc, char…

【Maven技术专题】「实战开发系列」盘点Maven项目中打包需要注意到的那点事儿

Maven项目打包需要注意到的那点事儿 Maven是什么Maven打包插件的作用Maven打包后经常出现的问题maven构建可运行Jar包 Maven打包的三种方式Maven打包的最简单的方法maven-jar-pluginMANIFEST.MF文件部分MANIFEST.MF的文件内容jar包的拷贝机制在pom.xml中配置 maven-jar-plugin的…