Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
题解
判断是否为平衡二叉树(任意节点的两个子树高度相差不超过1)
解法1 top-down
时间复杂度O(n^2), 有很多不必要的重复
class Solution {
public:
bool isBalanced (TreeNode *root) {
if (root == NULL) return true;
return abs(depth(root->left) - depth(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
}
private:
int depth(TreeNode *root){
if(!root) return 0;
return max(depth(root->left), depth(root->right)) + 1;
}
};
解法2 bottom-up
使用findHeight() 获取当前节点的高度,如果发现不平衡,直接返回-1。
对每个节点只需要判断它的儿子,而不必再遍历所有子孙,时间复杂度O(n)。
class Solution {
public:
bool isBalanced(TreeNode* root) {
return findHeight(root) != -1;
}
private:
int findHeight(TreeNode* root){
if(!root) return 0;
int leftHeight = findHeight(root->left);
int rightHeight = findHeight(root->right);
if(leftHeight == -1 || rightHeight == -1 || abs(leftHeight - rightHeight) > 1) return -1;
return max(leftHeight, rightHeight) + 1;
}
};