1.题目
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
2.分析
一棵树是否平衡二叉树可以分解为三个子问题:左子树是否平衡,右子树是否平衡,左右子树高度差是否超过1。
需要注意的是,递归可能会导致很多的重复计算。
例如,为了计算根结点的左右子树高度差,分别计算了根结点左右子树的高度。而为了判断左子树是否平衡,又计算了左子树的左右子树的高度差。在计算高度差这一块是有重复计算的。
单纯递归,会有很多重复计算。
int getHeight(TreeNode* root) {
if (root == NULL)
return 0;
return 1 + max(getHeight(root->left), getHeight(root->right));
}
bool isBalanced(TreeNode* root) {
if (root == NULL)
return true;
return isBalanced(root->left) && isBalanced(root->right) && abs(getHeight(root->left) - getHeight(root->right)) <= 1;
}
比较好的做法。在求子树高度的过程中提前判断是否平衡。如果子树不平衡,整棵树也不平衡。
class Solution {
public:
int GetHeight(TreeNode* root) {
if (root == NULL)
return 0;
int left = GetHeight(root->left);
if (left == -1)//左子树不平衡
return -1;
int right = GetHeight(root->right);
if (right == -1)//右子树不平和
return -1;
if (abs(left - right) > 1)//左右子树高度差大于1
return -1;
return 1 + max(left, right);
}
bool isBalanced(TreeNode* root) {
if (root == NULL)
return true;
return GetHeight(root) != -1;
}
};