利用之前求 二叉树高度的程序,加以平衡二叉树的条件判断。
平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
递归法:
参考上一题求二叉树的深度,先求出根结点的左右子树的深度,然后判断它们的深度相差不超过1,如果否,则不是一棵二叉树;如果是,再用同样的方法分别判断左子树和右子树是否为平衡二叉树,如果都是,则这就是一棵平衡二叉树。
但上面的方法在判断子树是否为平衡二叉树时,会重复遍历树的结点,不断地求子树的深度,所以效率不高。
class Solution {
public:
//求当前二叉树的高度
int Depth(TreeNode* pRoot){
int h, lh, rh;
if(pRoot == NULL) return 0; //处理空子树
else{
lh = Depth(pRoot->left); //求其左子树高度
rh = Depth(pRoot->right); //求其右子树高度
if(lh > rh) //求二叉树pRoot的高度
h = lh + 1;
else
h = rh + 1;
}
return h;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot == NULL) return true; //空子树即为平衡二叉树
int lh = Depth(pRoot->left); //求其左子树高度
int rh = Depth(pRoot->right); //求其右子树高度
int diff = lh - rh; //求左、右子树的高度差
if(diff > 1 || diff < -1) //高度差>1则返回false
return false; //只要有一次返回false,那么最终返回就会是false
//否则,分别进入其左、右子树进行判断
return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right);
}
};