剑指offer:判断二叉树是不是平衡二叉树

来源:互联网 发布:什么是软件过程模型 编辑:程序博客网 时间:2024/06/05 01:53

题目描述

输入一棵二叉树,判断该二叉树是否是平衡二叉树。
算法:
平衡二叉树的定义:平衡二叉树是一棵空树或者是左右子树高度差的绝对值不超过1的树,平衡二叉树的子树也是平衡二叉树。
我们采用后续遍历的方式,要判断一棵二叉树是不是平衡二叉树,先判断他的左右子树是不是平衡二叉树,并返回左右子树的高度。
1、如果左右子树中有一个不是平衡二叉树,那么这棵树就不是平衡的
2、如果左右子树都是平衡的,再判断左右子树的高度差来决定以当前节点为根的树是不是平衡的。
bool IsBalanced_Solution(TreeNode* pRoot) {
        if (NULL == pRoot){
            return true;
        }
        int height = 0;
        bool balance = false;
        IsBaLanced_Solution(pRoot, height, balance);
        return balance;


    }
    void IsBaLanced_Solution(TreeNode* pRoot, int &height, bool &balance){  //判断以pRoot所指的节点为根的树是不是平衡的,返回bool值balance表示是否平衡,并返回树的高度
        if (pRoot == NULL){
            height = 0;
            balance = true;
            return;
        }
        int leftH = 0;
        int rightH = 0;
        bool leftB = false;
        bool rightB = false;
        IsBaLanced_Solution(pRoot->left, leftH, leftB);
        IsBaLanced_Solution(pRoot->right, rightH, rightB);
        if (leftB && rightB){
            if (abs(leftH - rightH) <= 1){
                height = (leftH > rightH ? leftH : rightH) + 1;
                balance = true;
            }
            else {
                balance = false;
            }
        }
        else {
            balance = false;
        }
        return;
    }

下面的代码与上面的思想是一样的。这里通过这道题对函数参数及其返回值,做个小的总结。因为,之前做题都是直接看别人的代码,自己不熟练,别人怎么写,自己就这么写。再者对函数参数功能理解不透彻,通过解题思路来看函数参数和函数返回值如何设置,为今后做题提供借鉴。
在这道题目中,我们要判断一棵二叉树是否为平衡二叉树。判断的依据是平衡的二叉树的左、右子树是平衡的,并且左右子树的高度差不超过1。
那么最自然的想法就是先判断左右子树是否为平衡二叉树,在判断当前子树是否为平衡二叉树。那么判断左右子树是否为平衡二叉树时,其实就是判断一个二叉树是否为平衡二叉树(递归的思想)。这个判断的结果可以用函数返回值来给出树是否为平衡的。
那么,在判断完左右子树后,就要判断根节点了。这里的判断需要左右子树的高度。难道再去递归求左右子树的高度吗?这里就需要设定一个函数参数,并且这个参数是引用形式。在判断左右子树的同时,返回左右子树的高度。这样一举两得。

class Balance {
public:
    bool isBalance(TreeNode* root) {
        // write code here
        if (NULL == root){
            return true;
        }
        int height;
        return isBalance(root, height);
    }
    bool isBalance(TreeNode* root, int &height){
        if (root == NULL){
            return true;
            height=0;
        }
        int leftH = 0;
        int rightH = 0;
        bool balaLeft = true;
        bool balaRight = true;
        balaLeft = isBalance(root->left, leftH);
        balaRight = isBalance(root->right, rightH);
        height = leftH > rightH ? (leftH + 1) : (rightH + 1);
        return (balaLeft && balaRight && (abs(leftH - rightH) <= 1));
    }
};
0 0
原创粉丝点击