跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

平衡二叉树判定:从 O(n²) 暴力递归到 O(n) 自底向上优化

综述由AI生成平衡二叉树判定涉及两种递归策略。自顶向下方法直观但存在重复计算,时间复杂度为 O(n²);自底向上方法结合后序遍历与提前终止机制,将复杂度优化至 O(n)。文章通过代码对比展示了如何通过复用中间结果提升算法效率,适用于对性能敏感的数据结构场景。

开源信徒发布于 2026/3/21更新于 2026/5/98 浏览
平衡二叉树判定:从 O(n²) 暴力递归到 O(n) 自底向上优化

一、平衡二叉树

平衡二叉树又称 AVL 树:当一棵空树或者它的左右两棵子树的高度差的绝对值不超过一,并且两棵子树都是平衡二叉树。

【注意】 任意节点的左右子树高度差不超过一;所以子树都满足平衡条件。

二、思路分析

方法一:时间复杂度为 O(n²)

我们先看最直观的思路。如果根节点为空,自然是平衡二叉树。接着调用 getHeight 获取左右子树的高度,判断高度差的绝对值是否小于等于 1。如果满足,还要递归检查左右子树是否平衡。这种方法的时间复杂度是 O(n²),因为在计算每个节点的高度时,都会重复遍历其子树,导致大量冗余计算。

方法二:时间复杂度为 O(n)

优化的关键在于'自底向上'。同样先判断根节点是否为空。如果不为空,直接调用 getHeight 方法。这次我们让 getHeight 在计算高度的同时判断平衡性:如果树平衡,返回树的高度;如果不平衡,直接返回 -1。主函数只需判断返回值是否大于等于 0。这样每个节点只被访问一次,计算高度和判断平衡的操作合并为 O(1),整体时间复杂度降为 O(n)。

三、代码展示

public boolean isBalanced(TreeNode root) {
    if (root == null) {
        return true;
    }
    int leftH = getHeight(root.left);
    int rightH = getHeight(root.right);
    return Math.abs(leftH - rightH) <= 1 && isBalanced(root.left) && isBalanced(root.right);
}

public int getHeight(TreeNode root) {
    if (root == null) {
        return 0;
    }
    int leftH = getHeight(root.left);
    int rightH = getHeight(root.right);
    return leftH > rightH ? leftH + 1 : rightH + 1;
}
public   {
     (root == ) {
         ;
    }
     getHeight(root) >= ;
}

   {
     (root == ) {
         ;
    }
       getHeight(root.left);
     (leftH < ) {
         -;
    }
       getHeight(root.right);
     (leftH >=  && rightH >=  && Math.abs(leftH - rightH) <= ) {
         leftH > rightH ? leftH +  : rightH + ;
    }  {
         -;
    }
}
boolean
isBalanced
(TreeNode root)
if
null
return
true
return
0
public
int
getHeight
(TreeNode root)
if
null
return
0
int
leftH
=
if
0
return
1
int
rightH
=
if
0
0
1
return
1
1
else
return
1

四、总结

自顶向下的递归虽然直观,但重复计算导致 O(n²);自底向上利用后序遍历顺序,在计算高度的同时完成平衡判断,并通过提前返回避免无效计算,成功优化至 O(n)。这体现了算法设计中复用中间结果的重要性。

目录

  1. 一、平衡二叉树
  2. 二、思路分析
  3. 方法一:时间复杂度为 O(n²)
  4. 方法二:时间复杂度为 O(n)
  5. 三、代码展示
  6. 四、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Vue 与 C++:前端与系统开发的本质差异
  • AI 在数据库操作中的应用场景与实战优化
  • OOTDiffusion AI 虚拟试衣技术使用指南
  • Gazebo 机器人三维物理仿真平台
  • 零基础学习 Python:从入门到精通的学习路线与时间规划
  • 网络安全挖洞实战指南:工具准备与漏洞提交流程
  • Llama3 医疗大模型 OpenBioLLM 安装与应用指南
  • 麒麟 V10 ARM64 环境部署 WebLogic 12.2.1.4 实践
  • Java 大数据在智能家居环境监测与智能调节中的应用实战
  • 基于 SSM 和 Vue 的在线投稿系统设计与实现
  • 家庭用电数据分析与 Prophet 时间序列预测
  • IDEA 集成 AI 插件快速构建 Java 全栈功能实战
  • Spring Boot 结合 Leaflet 实现省级旅游口号 WebGIS 可视化
  • Kafka 核心机制与架构深度解析
  • Spring Boot 快速构建基于 Spring AI 的智能助手
  • Axum:Rust 高性能 Web 框架入门与实战
  • C/C++ 输入输出详解:OJ 场景与性能优化
  • C/C++ 算法入门:一维动态规划基础实战
  • 算法实战:位运算解决两数之和、唯一数字及消失数字问题
  • 数据结构:顺序表与链表经典算法实战

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online