给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例一:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回true
示例二:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回false
思路:我最开始的思路是求树中的最小高度和最大高度,如果两者之差大于1,则返回false。但是有一个测试点证明这个做法是错的。示例如下:
[1,2,2,3,3,3,3,4,4,4,4,4,4,null,null,5,5]
1
/ \
2 2
/ \ / \
3 3 3 3
/ \ / \ / \
4 4 4 4 4 4
/ \
5 5
应该返回true
这是一颗平衡二叉树,因为跟结点的左右结点的最大深度相差1。所以只能更改思路,然后我就根据定义走,二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。也就是说让每个结点及其左右子树看作一棵树,然后证明其是否为平衡二叉树。换句话说,证明这个结点是否为平衡二叉树就是证明其左右子树是否为平衡二叉树,也就是要证明左右子树的左右子树是否为平衡二叉树…。
bool isBalanced(TreeNode* root) {
if(!root) return true;
int l_max = max_depth(root -> left);
int r_max = max_depth(root -> right);
int minus = l_max - r_max > 0 ? l_max - r_max : r_max - l_max;
if (minus > 1) return false;
return isBalanced(root -> left) && isBalanced(root -> right);
}
int max_depth(TreeNode* root)
{
if (root == NULL) return 0;
if(root==NULL){
return 0;
}
else{
int depthl=max_depth(root->left);
int depthr=max_depth(root->right);
if(depthl>depthr)
return depthl + 1;
else
return depthr + 1;
}
}
更简化的写法:
bool flag = true;
bool isBalanced(TreeNode* root) {
judge(root);
return flag;
}
int judge(TreeNode* root)
{
if (!root) return 0;
int lheight = 1 + judge(root -> left);
int rheight = 1 + judge(root -> right);
if(abs(lheight - rheight) > 1) flag = false;
return max(lheight, rheight);
}