当前位置: 首页 > news >正文

每日一题-判断是否是平衡二叉树

判断是否是平衡二叉树

    • 题目描述
    • 数据范围
    • 题解
      • 解题思路
      • 递归算法
      • 代码实现
      • 代码解析
      • 时间和空间复杂度分析
      • 示例
        • 示例 1
        • 示例 2
      • 总结

)

题目描述

输入一棵节点数为 n 的二叉树,判断该二叉树是否是平衡二叉树。平衡二叉树定义为:

  1. 它是一棵空树。
  2. 或者它的左右子树的高度差的绝对值不超过1,并且左右子树本身也是平衡二叉树。

平衡二叉树的性质:

  • 空树被认为是平衡二叉树。
  • 每个节点的左右子树高度差不超过1。
    平衡二叉树示例

数据范围

  • n ≤ 100
  • 每个节点的值 val 满足 0 ≤ val ≤ 1000

题解

解题思路

我们可以通过深度优先搜索(DFS)来判断一棵二叉树是否是平衡二叉树。具体步骤如下:

  1. 定义树的高度: 计算任意一个节点的左子树和右子树的高度。
  2. 平衡性判断: 如果某个节点的左右子树的高度差超过1,树就不平衡;否则继续判断该节点的左右子树。
  3. 递归遍历: 对树的每个节点递归地进行平衡性判断。

递归算法

我们可以通过递归来判断二叉树的平衡性,同时在递归过程中计算树的高度。递归的核心思想是:

  • 如果左右子树的高度差超过1,返回 false
  • 否则继续判断左右子树的平衡性。

为了避免重复计算,我们可以在递归时直接返回每个子树的高度。

代码实现

#include <stdbool.h>// 定义二叉树节点结构体
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
};// 计算树的高度
int height(struct TreeNode* pRoot) {if (pRoot == NULL)return 0;  // 空树高度为0int left = height(pRoot->left);  // 左子树的高度int right = height(pRoot->right);  // 右子树的高度if (left == -1 || right == -1 || abs(left - right) > 1) {return -1;  // 如果左右子树高度差超过1,返回-1,表示不平衡}return 1 + (left > right ? left : right);  // 返回树的高度
}// 判断是否为平衡二叉树
bool IsBalanced_Solution(struct TreeNode* pRoot) {return height(pRoot) != -1;  // 如果高度返回-1,表示不平衡
}

代码解析

  1. height 函数: 计算二叉树的高度,同时判断树是否平衡。

    • 如果当前节点为空,返回高度 0
    • 递归计算左子树和右子树的高度。
    • 如果某个子树的高度差超过1,或者某个子树本身不平衡(返回 -1),就返回 -1 表示树不平衡。
    • 否则,返回当前树的高度。
  2. IsBalanced_Solution 函数: 通过调用 height 函数来判断整棵树是否平衡。如果 height 返回 -1,则说明树不平衡,返回 false;否则返回 true

时间和空间复杂度分析

  • 时间复杂度: O(n)。每个节点只会被访问一次,时间复杂度为 O(n),其中 n 是树的节点数。
  • 空间复杂度: O(h)。递归调用栈的深度是树的高度 h,最坏情况下(例如完全不平衡的树),空间复杂度为 O(n)

示例

示例 1

输入:

{1,2,3,4,5,6,7}

输出:

true
示例 2

输入:

{}

输出:

true

总结

本题通过递归遍历二叉树,计算每个节点的左右子树高度,同时判断左右子树的高度差是否超过1来判断树是否平衡。时间复杂度为 O(n),空间复杂度为 O(h),其中 n 是节点数,h 是树的高度。非常难得是居然一次编译直接成功了,太开心了。题刷百编,其意自现。

相关文章:

每日一题-判断是否是平衡二叉树

判断是否是平衡二叉树 题目描述数据范围题解解题思路递归算法代码实现代码解析时间和空间复杂度分析示例示例 1示例 2 总结 ) 题目描述 输入一棵节点数为 n 的二叉树&#xff0c;判断该二叉树是否是平衡二叉树。平衡二叉树定义为&#xff1a; 它是一棵空树。或者它的左右子树…...

FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验

文章目录 FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验概述笔记my_fltk_test.cppfltk_test.hfltk_test.cxx用adjuster工程试了一下&#xff0c;好使。END FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验 概述 用fluid搭建UI…...

《多阶段渐进式图像修复》学习笔记

paper&#xff1a;2102.02808 GitHub&#xff1a;swz30/MPRNet: [CVPR 2021] Multi-Stage Progressive Image Restoration. SOTA results for Image deblurring, deraining, and denoising. 目录 摘要 1、介绍 2、相关工作 2.1 单阶段方法 2.2 多阶段方法 2.3 注意力机…...

AWScurl笔记

摘要 AWScurl是一款专为与AWS服务交互设计的命令行工具&#xff0c;它模拟了curl的功能并添加了AWS签名版本4的支持。这一特性使得用户能够安全有效地执行带有AWS签名的请求&#xff0c;极大地提升了与AWS服务交互时的安全性和有效性。 GitHub - okigan/awscurl: curl-like acc…...

QT使用eigen

QT使用eigen 1. 下载eigen https://eigen.tuxfamily.org/index.php?titleMain_Page#Download 下载后解压 2. QT引入eigen eigen源码好像只有头文件&#xff0c;因此只需要引入头文件就好了 qt新建项目后。修改pro文件. INCLUDEPATH E:\222078\qt\eigen-3.4.0\eigen-3.…...

揭示Baklib企业内容管理系统CMS的核心功能与应用价值

内容概要 企业内容管理系统&#xff08;CMS&#xff09;是指通过一系列工具和技术&#xff0c;帮助企业高效地创建、存储、管理和分发数字内容的系统。这些系统在现代企业运作中发挥着至关重要的作用&#xff0c;尤其是在信息量大、业务流程复杂的环境中。Baklib作为一个突出的…...

如何跨互联网adb连接到远程手机-蓝牙电话集中维护

如何跨互联网adb连接到远程手机-蓝牙电话集中维护 --ADB连接专题 一、前言 随便找一个手机&#xff0c;安装一个App并简单设置一下&#xff0c;就可以跨互联网的ADB连接到这个手机&#xff0c;从而远程操控这个手机做各种操作。你敢相信吗&#xff1f;而这正是本篇想要描述的…...

flume和kafka整合 flume和kafka为什么一起用?

‌Flume和Kafka一起使用的主要原因是为了实现高效、可靠的数据采集和实时处理。‌‌12 实时流式日志处理的需求 Flume和Kafka结合使用的主要目的是为了完成实时流式的日志处理。Flume负责数据的采集和传输,而Kafka则作为消息缓存队列,能够有效地缓冲数据,防止数据堆积或丢…...

java.util.Random类(详细案例拆解)(已完结)

前言&#xff1a; 小编打算近期更俩三期类的专栏&#xff0c;一些常用的专集类&#xff0c;给大家分好类别总结和详细的代码举例解释。 今天是除夕&#xff0c;小编先祝贺大家除夕快乐啦&#xff01;&#xff01; 今天是第六个 java.lang.Math 包中的 java.util.Random类 我…...

Java后端之AOP

AOP&#xff1a;面向切面编程&#xff0c;本质是面向特定方法编程 引入依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>示例&#xff1a;记录…...

【信息系统项目管理师-选择真题】2008上半年综合知识答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7~8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16~20题】【第21题】【第22题】【第23题】【第24题】【第25题…...

go到底是什么意思:对go的猜测或断言

go这个单词&#xff0c;简单地讲&#xff0c;表示“走或去”的意思&#xff1a; go v.去&#xff1b;走 认真想想&#xff0c;go是一个非常神秘的单词&#xff0c;g-和o-这两个字母&#xff0c;为什么就会表达“去&#xff1b;走”的意思呢&#xff1f;它的字面义或本质&…...

零刻SER7接口及配置跑分

今天入手了一台迷你机-零刻SER7 &#xff0c;不得不说这机身是真的小啊&#xff0c;相比于传统台式机&#xff0c;它几乎不占空间&#xff0c;可以轻松放置在桌面、电视柜甚至背包中&#xff0c;非常适合需要频繁移动或空间有限的用户。尽管体积小巧&#xff0c;但零刻SER7在性…...

【Java基础-41.5】深入解析Java异常链:构建清晰的错误追踪体系

在Java编程中&#xff0c;异常处理是保证程序健壮性和可维护性的重要部分。然而&#xff0c;在实际开发中&#xff0c;异常往往不是孤立发生的&#xff0c;而是由一系列相关的异常引发的。为了更好地理解和处理这种复杂的异常场景&#xff0c;Java引入了 异常链&#xff08;Exc…...

【Python实现机器遗忘算法】复现2023年TNNLS期刊算法UNSIR

【Python实现机器遗忘算法】复现2023年TNNLS期刊算法UNSIR 1 算法原理 Tarun A K, Chundawat V S, Mandal M, et al. Fast yet effective machine unlearning[J]. IEEE Transactions on Neural Networks and Learning Systems, 2023. 本文提出了一种名为 UNSIR&#xff08;Un…...

Object类(3)

大家好&#xff0c;今天继续给大家介绍一下object类中的方法&#xff0c;那么话不多说&#xff0c;来看。 hashcode()这个方法,帮我们算了一个具体的对象位置,这里面涉及到数据结构,简单认为它是个内存地址,然后调用Integer.toHexString ()将这个地址以16进制输出。 该方法是一…...

Zookeeper(32) Zookeeper的版本号(version)是什么?

在 Zookeeper 中&#xff0c;每个节点都有多个版本号&#xff08;version&#xff09;&#xff0c;用于跟踪节点的状态变化。版本号帮助 Zookeeper 实现乐观并发控制&#xff0c;确保在并发环境中的数据一致性。主要的版本号包括&#xff1a; version&#xff1a;数据版本号&a…...

C# as 和 is 运算符区别和用法

前言 在C#中&#xff0c;as 和 is 关键字都用于处理类型转换的运算符&#xff0c;但它们有不同的用途和行为。本文我们将详细解释这两个运算符的区别和用法。 is 运算符 is 运算符用于检查对象是否是某个特定类型&#xff0c;或者是否可以转换为该类型。它返回一个布尔值 (t…...

求解旅行商问题的三种精确性建模方法,性能差距巨大

文章目录 旅行商问题介绍三种模型对比求解模型1决策变量目标函数约束条件Python代码 求解模型2决策变量目标函数约束条件Python代码 求解模型3决策变量目标函数约束条件Python代码 三个模型的优势与不足 旅行商问题介绍 旅行商问题 (Traveling Salesman Problem, TSP) 是一个经…...

SQL-leetcode—1193. 每月交易 I

1193. 每月交易 I 表&#xff1a;Transactions ---------------------- | Column Name | Type | ---------------------- | id | int | | country | varchar | | state | enum | | amount | int | | trans_date | date | ---------------------- id 是这个表的主键。 该表包含…...

Phi-3-Mini-128K多轮对话效果实测:复杂任务规划与分解

Phi-3-Mini-128K多轮对话效果实测&#xff1a;复杂任务规划与分解 最近&#xff0c;我花了不少时间深度体验了Phi-3-Mini-128K这款模型。它的名字里带着“128K”&#xff0c;这超长的上下文长度&#xff0c;让我特别好奇它在处理复杂、多轮对话时的真实表现。毕竟&#xff0c;…...

Ku频段相控阵天线避坑指南:从G/T骤降到EIRP波动,这些实测数据你要知道

Ku频段相控阵天线性能衰减实测&#xff1a;60离轴角下的G/T与EIRP工程修正策略 相控阵天线在卫星通信领域正经历从实验室到工程应用的跨越式发展。当无人机以60离轴角追踪卫星时&#xff0c;实测数据显示天线增益可能骤降4.5dB——这个数字足以让精心计算的链路预算彻底失效。在…...

GoldHEN Cheats Manager:开源工具提升PS4游戏体验的全方位解决方案

GoldHEN Cheats Manager&#xff1a;开源工具提升PS4游戏体验的全方位解决方案 【免费下载链接】GoldHEN_Cheat_Manager GoldHEN Cheats Manager 项目地址: https://gitcode.com/gh_mirrors/go/GoldHEN_Cheat_Manager GoldHEN Cheats Manager是一款专为PlayStation 4打造…...

GPEN快速上手教程:手机自拍模糊修复,30秒获取高清证件照

GPEN快速上手教程&#xff1a;手机自拍模糊修复&#xff0c;30秒获取高清证件照 你是不是也遇到过这种情况&#xff1a;急着要用证件照&#xff0c;翻遍手机相册却发现每张自拍都模糊不清&#xff1f;要么是光线太暗&#xff0c;要么是手抖拍糊了&#xff0c;要么就是像素太低…...

【电气数据】电力网络充电站定价策略数据集

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

移植U-Boot驱动到XSDK裸机程序:以RTL8211FS在Zynq上的网络调试为例

移植U-Boot驱动到XSDK裸机程序&#xff1a;以RTL8211FS在Zynq上的网络调试为例 在嵌入式开发中&#xff0c;驱动移植是一项常见但极具挑战性的任务。当我们需要将已经在U-Boot或Linux环境下稳定工作的硬件驱动移植到裸机环境时&#xff0c;往往会遇到各种意料之外的问题。本文…...

哪种编程语言更契合 Claude Code?:从代码行数到 Token 时代的效能重构

在软件开发的漫长岁月中&#xff0c;我们曾习惯于用代码行数来衡量工作量&#xff1b;而今&#xff0c;在 AI 编程的纪元&#xff0c;工作量的天平正向 Token 计数倾斜。就在几周前&#xff0c;GitHub 上涌现出一项令人侧目的基准测试&#xff1a;mame/ai-coding-lang-bench。其…...

Vue3 模板引用 (ref):操作 DOM 与子组件实例 从入门到精通

前言 在 Vue 的数据驱动思想下&#xff0c;我们通常通过修改数据来驱动视图更新&#xff0c;避免直接操作 DOM。但在实际开发中&#xff0c;总会遇到一些非 DOM 不可的场景&#xff1a;比如获取输入框焦点、调用第三方库初始化画布、获取子组件的数据或方法等。 这时候&#xf…...

手把手教你搭建基于Matlab/Simulink的插电式混合动力汽车4驱PHEV模型

基于Matlab/simulink的插电式混合动力汽车建模仿真模型4驱PHEV&#xff08;比亚迪唐DM混动系统P2P4发动机——三擎四驱&#xff09;&#xff0c;包括整车HCU控制单元、发动机模型、驱动电机模型、ISG电机模型、AMT5档自动变速箱模型、驾驶员模型、电池能量管理控制模型等&#…...

解锁B站视频下载:5个高效技巧让你轻松获取心仪内容

解锁B站视频下载&#xff1a;5个高效技巧让你轻松获取心仪内容 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/B…...