一、平衡二叉树
平衡二叉树又称 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 + ;
} {
-;
}
}


