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

剑指offer54_平衡二叉树

平衡二叉树


输入一棵二叉树的根结点,判断该树是不是平衡二叉树。

如果某二叉树中任意结点的左右子树的深度相差不超过 1,那么它就是一棵平衡二叉树。

注意:

  • 规定空树也是一棵平衡二叉树。
数据范围

树中节点数量 [0,500][0,500][0,500]

样例
输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示,5/ \7  11/  \12   9输出:true

算法思路

该算法用于判断给定的二叉树是否是平衡的。平衡二叉树的定义是:对于树中的任意节点,其左子树和右子树的高度差不超过1。

  1. 深度优先搜索(DFS):算法采用后序遍历的方式递归地计算每个节点的左右子树高度。
  2. 高度差检查:在递归过程中,比较当前节点的左右子树高度差,如果超过1,则将全局变量ans设为false
  3. 返回高度:每个递归调用返回当前节点的高度(左右子树高度的最大值加1),供父节点使用。
时间复杂度
  • O(n):其中n是二叉树的节点数。每个节点仅被访问一次,因此时间复杂度是线性的。
空间复杂度
  • O(h):其中h是二叉树的高度。空间复杂度主要由递归调用栈的深度决定,最坏情况下(树完全不平衡)为O(n),最好情况下(树完全平衡)为O(log n)。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool ans = true; // 全局变量,用于记录树是否平衡bool isBalanced(TreeNode* root) {dfs(root); // 从根节点开始深度优先搜索return ans; // 返回结果}// 辅助函数:计算节点高度并检查平衡性int dfs(TreeNode* root) {if (!root) return 0; // 空节点高度为0int l = dfs(root->left);  // 递归计算左子树高度int r = dfs(root->right); // 递归计算右子树高度if (abs(l - r) > 1) ans = false; // 如果高度差超过1,树不平衡return max(l, r) + 1; // 返回当前节点的高度}
};
关键点
  • 后序遍历:先处理左右子树,再处理当前节点,确保高度计算正确。
  • 全局变量ans:用于在递归过程中记录是否发现不平衡的节点。
  • 高度差检查:在每次递归返回高度前,检查左右子树高度差。
http://www.xdnf.cn/news/15040.html

相关文章:

  • PostgreSQL如何进行跨服务器迁移数据
  • JavaEE初阶第八期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(六)
  • Flink-1.19.0源码详解-番外补充4-JobGraph图
  • HTML应用指南:利用GET请求获取全国山姆门店位置信息
  • 二分查找篇——在排序数组中查找元素的第一个和最后一个位置【LeetCode】
  • Go 延迟调用 defer 用法详解
  • dify配置邮箱,密码重置以及邮箱邀请加入
  • Android Notification 通过增加addAction 跳转回Service重新执行逻辑
  • 中山排气歧管批量自动化智能化3D尺寸测量及cav检测分析
  • QNX中timer的使用
  • 【C++】容器适配器 + stack/queue/deque详解
  • Android-重学kotlin(协程源码第二阶段)新学习总结
  • 【Linux网络编程】Socket - TCP
  • linux-进程信号的产生与发送
  • WPF使用WebBrowser 解决href标签target=_blank在浏览器窗口打开新链接而非窗体内部打开的问题
  • Python 项目快速部署到 Linux 服务器基础教程
  • 【macOS】【Swift】不让App采用macOS的外观风格,直接保持白色背景,怎么处理?
  • 区块链平台以太坊核心原理
  • [Backlog] 核心协调器 | 终端用户界面(TUI)实现 | 多分支任务冲突解决 | 测试验证体系
  • 以太坊智能合约核心技术解析与应用实践
  • Energy-Based Transformers:实现通用系统2思维的新范式
  • docker部署华为高斯数据库opengauss(arm版本)
  • python作业 1
  • 如何通过配置gitee实现Claude Code的版本管理
  • 网络请求与现实生活:用办理业务类比理解HTTP通信
  • Linux 测开:日志分析 + 定位 Bug
  • Android-重学kotlin(协程基础)新学习总结
  • 安卓10.0系统修改定制化____修改ROM 实现自动开启USB 安装选项
  • UI前端与数字孪生融合新领域拓展:智慧教育的虚拟实验室建设
  • UI前端大数据处理性能评估与优化:基于负载测试的数据处理能力分析