Leetcode 110-平衡二叉树

news2024/11/15 20:27:48

在这里插入图片描述

1. 递归法求解

递归三部曲

  • 确定递归函数的参数及其返回值
  • 确定终止条件
  • 确定单层递归逻辑

深度:从上往下
高度:从下往上

1.1 根据深度求解
  • 构建求二叉树节点深度的函数(后序遍历)
  • 递归求该树是否是平衡二叉树(前序遍历)
    • 递归函数的参数只需要当前节点 TreeNode* cur,返回值为 bool
    • 终止条件:当前节点为空,则直接返回 true
    • 单层递归逻辑:(1)判断当前节点(2)判断左子树(3)判断右子树
    int lDepth = getDepth(root->left);
    int rDepth = getDepth(root->right);
    if(abs(lDepth - rDepth) > 1){				//判断中间节点是否满足条件
        return false;
    }
    bool lflag = isBalanced(root->left);		//判断左子树是否满足条件
    bool rflag = isBalanced(root->right);		//判断右子树是否满足条件
    return lflag && rflag;
    
int getDepth(TreeNode* node){
   if(node == NULL)
       return 0;
   return 1 + max(getDepth(node->left), getDepth(node->right));
}

bool isBalanced(TreeNode* root) {
   if(root == NULL)
       return true;
   int lDepth = getDepth(root->left);
   int rDepth = getDepth(root->right);
   if(abs(lDepth - rDepth) > 1){
       return false;
   }
   return isBalanced(root->left) && isBalanced(root->right);
}

1.2 根据高度求解(后序遍历)

  • 递归求高度
    • 递归函数的参数只需要当前节点 TreeNode* node,返回值为以该节点为根节点树的高度
    //-1表示已经不是平衡二叉树了,否则返回值为以该节点为根节点树的高度
    int getHeight(TreeNode* node)
    
    • 终止条件:当前节点为空,直接返回0
    • 单层递归逻辑
    int lHeight = getHeight(node->left);					//左
    if(lHeight == -1)	return -1;
    int rHeight = getHeight(node->right);					//右
    if(rHeight == -1)	return -1;
    
    int result;
    if(abs(lHeight - rHeight) > 1)							//中
    	result = -1;
    else
    	result = 1 + max(lHeight, rHeight);					//以当前节点为根节点的树的最大高度
    return result;
    
// 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1
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;
}

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

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

相关文章

国产化麒麟linux系统开发编译常见问题汇总

团队自研股票软件关注威信龚总号:QStockView,下载 1 问题处理 1.1 Unknown module in QT:QJsonDocument 缺少QJsonDocument 解决方法: Pro文件中加上 QTcore; 播放器库问题 1.2 代码中汉字乱码需要设置文件编码格式 原因分析&…

2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?

2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline? 答案2023-06-03: Redis客户端执行一条命令通常包括以下四个阶段: 1.发送命令:客户端将要执行的命令发送到Redis服务器。 2.命令排队&#…

内网安全:Cobalt Strike 工具 渗透多层内网主机.(正向 || 反向)

内网安全:Cobalt Strike 工具 渗透多层内网主机. Cobalt Strike 是一款以 metasploit 为基础的 GUI 的框架式渗透工具,又被业界人称为 CS。拥有多种协议主机上线方式,集成了端口转发,服务扫描,自动化溢出,…

Docker容器化Java程序

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Docker容器化Java程序 Docker:用于创建和管理容器的开源平台 Java运行环境:Java是一个跨平台的编程语言,因此在CentOS系统中需要安…

一个帮助写autoprefixer配置的网站

前端需要用到postcss的工具,用到一个插件叫autoprefixer,这个插件能够给css属性加上前缀,进行一些兼容的工作。 如何安装之类的问题在csdn上搜一下都能找到(注意,vite是包含postcss的,不用在项目中安装pos…

[图表]pyecharts模块-柱状图2

[图表]pyecharts模块-柱状图2 先来看代码&#xff1a; from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker import Fakerx Faker.dogs Faker.animal xlen len(x) y [] for idx, item in enumerate(x):if idx < xlen / 2:y…

Visual Studio Code里如何运行html (Windows 10 和 Mac OS)

在Web 开发时&#xff0c;作为Web 开发基本都是从编写 HTML 网页开始的。这篇文章讲的是如何起步配置开发环境来运行 HTML 代码。 在Windows和Mac 的 VS Code中都可以运行 HTML。 打开VS Code&#xff0c;在VS Code中安装&#xff0c;Code Runner&#xff0c; 如下所示 2、这…

【群智能算法改进】一种改进的算术优化算法 改进算术优化算法 改进AOA[1]【Matlab代码#37】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 基础算术优化算法2. 改进算术优化算法2.1 随机概率因子2.2 强制切换机制 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 基础算术优化算法 算术优化算法是一类基于…

mount -l | grep bpf

BPF & Cillum mount -l | grep bpfBPF&#xff08;Berkeley Packet Filter&#xff09;文件系统netfilter和tcprofiling和tracingHTTP、gRPC和Kafka等协议VXLAN组网模式BGP&#xff08;Border Gateway Protocol&#xff09; mount -l | grep bpf 这是一个通过运行mount -l…

Linux 实操篇-Linux 磁盘分区、挂载

Linux 实操篇-Linux 磁盘分区、挂载 Linux 分区 原理介绍 Linux 来说无论有几个分区&#xff0c;分给哪一目录使用&#xff0c;它归根结底就只有一个根目录&#xff0c;一个独立且唯一的文件结构, Linux 中每个分区都是用来组成整个文件系统的一部分。Linux 采用了一种叫“载…

使用数据库连接池来快速访问数据库Druid

使用数据库连接池来快速访问数据库Druid 简介为什么使用连接池原理及使用连接池访问数据库的优势开源项目 alibaba/druid 地址 使用方法准备jar包定义Druid的配置文件 代码示例 简介 数据库连接池是一个容器&#xff0c;负责分配、管理数据库的连接(Connection)。通过连接池可…

[图表]pyecharts模块-反转柱状图

[图表]pyecharts模块-反转柱状图 先来看代码&#xff1a; from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker import Fakerc (Bar().add_xaxis(Faker.choose()).add_yaxis("商家A", Faker.values()).add_yaxis("…

图论与算法(2)图的基本表示

1. 图的分类 &#xff08;1&#xff09; 有向图和无向图&#xff1a; 有向图&#xff08;Directed Graph&#xff09;&#xff1a;图中的边具有方向&#xff0c;表示节点之间的单向关系。无向图&#xff08;Undirected Graph&#xff09;&#xff1a;图中的边没有方向&#x…

【Web开发技术】数据缓存中间件Redis(非关系型数据库)

文章目录 一、引言1、介绍2、五种常用数据类型 二、配置1、下载2、使用 三、使用1、命令行操作&#xff08;1&#xff09;字符串&#xff08;2&#xff09;哈希&#xff08;3&#xff09;列表&#xff08;4&#xff09;集合 set&#xff08;5&#xff09;有序集合 sorted set&a…

python基础练习题20道,快收藏起来检测自己吧 !

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 实例001&#xff1a;数字组合 题目&#xff1a; 有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; 答案跳转 实例002&#xff1a;“个税计…

路径规划算法:基于乌燕鸥优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于乌燕鸥优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于乌燕鸥优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

Leetcode 剑指 Offer II 029. 排序的循环链表

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定循环单调非递减列表中的一个点&#xff0c;写一个函数向这个…

基于QT的智能家居中控系统的简明设计

文章目录 系统总体说明主板UI设计后续改进与完善 系统总体说明 系统采用 “主从式架构” &#xff0c;即一主多从式&#xff0c;该智能居家控制系统的主要功能包括登录功能、注册功能、音乐播放功能、时间显示、日历显示、温度湿度光照气压海拔数据等环境指标数据显示等。   …

【Linux】基于阻塞队列的生产消费模型

文章目录 生产者消费者模型基本概念生产者消费者模型优点生产者消费者模型的特点 基于阻塞队列的生产者消费者模型阻塞队列-BlockingQueue C模拟实现基于阻塞队列的生产消费模型BlockQueue.hpp基本框架构造析构判空&&判满从阻塞队列插入数据向阻塞队列获取数据 Cptest.…

用pandasai轻松上手Python数据分析

一、引言 最近&#xff0c;一位名叫Gabriele Venturi的软件工程师在github上建立了pandasai的项目。据官方介绍&#xff0c;pandasai是一个 Python 第三方库&#xff0c;将人工智能的生成能力集成到pandas包中&#xff0c;使数据分析具有对话性。实际上&#xff0c;该第三方包…