给定二叉树,判断是否高度平衡:任意节点的左右子树高度差不超过 1。
递归函数返回子树高度,若发现不平衡立即标记并上传,避免重复计算。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
// 返回以 root 为根的子树高度,若不平衡返回 -1
int checkHeight(TreeNode* root) {
if (!root) return 0;
int leftH = checkHeight(root->left);
if (leftH == -1) return -1;
int rightH = checkHeight(root->right);
if (rightH == -1) return -1;
if (abs(leftH - rightH) > 1) return -1;
return 1 + max(leftH, rightH);
}
bool isBalanced(TreeNode *root) {
return checkHeight(root) != -1;
}
};
// 低效:重复计算高度,O(n log n) 甚至 O(n²)
int height(TreeNode* root) {
if (!root) return 0;
return 1 + max(height(root->left), height(root->right));
}
bool isBalanced(TreeNode* root) {
if (!root) return true;
int lh = height(root->left), rh = height(root->right);
return abs(lh - rh) <= 1
&& isBalanced(root->left)
&& isBalanced(root->right);
}
判定是基础,工程中更常用自平衡 BST(AVL、红黑树)维护动态有序集合,插入/删除后通过旋转保持平衡,保证 O(log n) 操作复杂度。