平衡二叉树
描述
输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
注:我们约定空树是平衡二叉树。
数据范围:n<=100,树上节点的val值满足 0<=n<=1000
要求:空间复杂度O(1),时间复杂度 O(n)
示例1
输入:
{1,2,3,4,5,6,7}
返回值:
true
示例2
输入:
{}
返回值:
true
**解题思路:**是否为平衡二叉树关键在于树叶最大高度差不能超过1,因此我们要想知道是否为平衡二叉树必须知道树的每一个叶子节点的深度。我们可以使用递归法,从叶子节点逐层向上递归,递归的同时传递此节点的最大深度。下面开始写代码:
C++版:
int depth(TreeNode *root)
{
if(root==nullptr)
return 0;//如果节点为空说明root为叶子节点,直接返回0
int left=depth(root->left);//开始向左字数递归,left记录左子树的最大深度
if(left==-1)
return -1;//如果发现左子树不平衡后就直接返回,不需要继续下面的高度求解了
int right=depth(root->right);//同上
if(right==-1)
return -1;
if(abs(left-right)>1)//如果左子树与右子树高度相差大于1则返回-1
return -1;
else
return 1+(left>right?left:right);//否则返回root节点的最大深度
}
bool IsBalanced_Solution(TreeNode* pRoot) {
return depth(pRoot)!=-1;//调用depth函数判断树是否为平衡二叉树
}
Java版:
public class Solution {
public int depth(TreeNode root){
if(root == null)return 0;
int left = depth(root.left);
if(left == -1)return -1; //如果发现子树不平衡之后就没有必要进行下面的高度的求解了
int right = depth(root.right);
if(right == -1)return -1;//如果发现子树不平衡之后就没有必要进行下面的高度的求解了
if(left - right <(-1) || left - right > 1)
return -1;
else
return 1+(left > right?left:right);
}
public boolean IsBalanced_Solution(TreeNode root) {
return depth(root) != -1;
}