一、平衡二叉树
平衡二叉树(AVL 树)的定义是:一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是平衡二叉树。
注意 任意节点的左右子树高度差不超过 1,这意味着整棵树必须满足平衡条件。

二、思路分析
方法一:时间复杂度为 O(n²)
最直观的思路是自顶向下。首先判断根节点是否为空,若为空则返回 true。接着计算左右子树的高度,如果高度差绝对值小于等于 1,再递归检查左右子树是否平衡。
这种方法的问题在于重复计算。每次调用 getHeight 都会遍历该子树的所有节点。对于每个节点,我们都要重新计算其高度,导致大量冗余操作。在极端情况下(如链表形态),时间复杂度会退化为 O(n²)。

方法二:时间复杂度为 O(n)
为了优化效率,我们可以采用自底向上的后序遍历策略。核心思想是在计算高度的同时判断平衡性。
定义一个辅助函数 getHeight:
- 如果当前节点为空,返回高度 0。
- 递归获取左子树高度,如果左子树不平衡(返回 -1),直接返回 -1。
- 递归获取右子树高度,同样检查是否不平衡。
- 如果左右子树都平衡且高度差 <= 1,返回当前树的高度;否则返回 -1。
主函数只需判断 getHeight(root) 是否 >= 0。这样每个节点只被访问一次,时间复杂度降为 O(n)。

三、代码展示
方案一:自顶向下(O(n²))
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
int leftH = getHeight(root.left);
int rightH getHeight(root.right);
Math.abs(leftH - rightH) <=
&& isBalanced(root.left)
&& isBalanced(root.right);
}
{
(root == ) {
;
}
getHeight(root.left);
getHeight(root.right);
leftH > rightH ? leftH + : rightH + ;
}


