平衡二叉树(AVL树)要求任意节点的左、右子树高度差不超过1,需递归检查每个节点;推荐用后序遍历+剪枝,返回-1表示失衡,否则返回高度,时间复杂度O(n)。

什么是平衡二叉树?先看定义再动手
平衡二叉树(AVL树)要求:对任意节点,其左子树与右子树的高度差不超过1。注意,不是整棵树高度≤某值,而是每个节点都要满足这个条件。很多人一上来就只算根节点高度差,结果漏判中间某个子树失衡。
判断逻辑必须递归检查每个节点——但暴力做法(对每个节点都重新算左右子树高度)时间复杂度是 O(n²),实际项目里不能接受。
用后序遍历 + 剪枝,一次递归搞定
核心思路:自底向上计算高度,同时在回溯过程中检查平衡性。一旦发现某个节点不平衡,立刻返回标记,避免无谓计算。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用返回值同时携带两个信息:是否平衡(bool)、当前子树高度(int)
- 推荐封装成
std::pair<bool, int>或写个辅助函数返回 -1 表示失衡,否则返回高度 - 关键剪枝点:
leftHeight == -1 || rightHeight == -1就直接返回 -1,不继续算
int checkHeight(TreeNode* node) {
if (!node) return 0;
int left = checkHeight(node->left);
if (left == -1) return -1;
int right = checkHeight(node->right);
if (right == -1) return -1;
if (abs(left - right) > 1) return -1;
return std::max(left, right) + 1;
}
// 调用:return checkHeight(root) != -1;
容易踩的坑:空节点、单边树、INT_MAX 边界
- 空节点高度是 0,不是 -1(否则高度差计算会错),这点和某些教材的“空树高度为 -1”定义不同,C++ 实现中统一按 0 更稳妥
- 单边链状树(如只有右子节点)高度差会逐层累积,到根节点才暴露问题,别依赖肉眼观察
- 如果用
int 存高度,极端情况(百万级节点)可能溢出,但一般题目数据范围不用考虑;真遇到大深度,改用 size_t 或加深度限制更安全
-
abs(left - right) 中 left/right 是非负数,但若实现中误传负值(比如忘了检查 -1 返回),abs 会掩盖错误,建议显式判断 left == -1 再短路
LeetCode 110 题验证时要注意什么
int 存高度,极端情况(百万级节点)可能溢出,但一般题目数据范围不用考虑;真遇到大深度,改用 size_t 或加深度限制更安全abs(left - right) 中 left/right 是非负数,但若实现中误传负值(比如忘了检查 -1 返回),abs 会掩盖错误,建议显式判断 left == -1 再短路LeetCode 的 TreeNode 定义不含 height 字段,别想着先遍历一遍存高度再查——那样是两趟 O(n),不如直接后序一遍到位。
立即学习“C++免费学习笔记(深入)”;
- 测试用例包含空树(
root == nullptr),应返回 true - 存在“仅根节点 + 单个子节点”的情况,高度差为 1,属于平衡
- 如果你用全局变量或引用传参来记录是否失衡,要确保每次调用前重置,否则多个测试用例间状态污染
平衡的关键不在顶层,而在每个分支节点——漏掉任何一个子树的检查,就等于没做。

















