剑指Offer 平衡二叉树

利用之前求 二叉树高度的程序,加以平衡二叉树的条件判断。

平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过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);
    }
};

 

点赞