一、题目描述

题目大意:输入一棵二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
注:我们约定空树是平衡二叉树
注意审题:空树是平衡二叉树

算法(自底向上递归)

算法思路

1.总体思路:判断一棵树是不是平衡二叉树,也就是判断它左子树和右子树的高度差是否超过了1,因此我们可以自底向上上递归,每次检查以当前结点为根的数是否满足条件,然后将判断条件上传
2.我们每次都要调用一个求二叉树高度的函数,因此时间复杂度较高

代码实现(C++11)

class Solution {
public:
    bool IsBalanced_Solution(TreeNode* pRoot) {
        return check(pRoot);
    }

    bool check(TreeNode* root){
        if(!root) return true;
        int left = dfs(root->left);
        int right = dfs(root->right);
        if(abs(left - right) > 1) return false;
        return check(root->left) && check(root->right);
    }

    int dfs(TreeNode* root){
        if(!root) return 0;
        int left = dfs(root->left);
        int right = dfs(root->right);
        return max(left, right) + 1;
    }
};

时间复杂度:O(n^2)
空间复杂度:O(n^2)

时间复杂度优化

其实我们可以用-1来代替不合法的状态,若某棵子树的高度为-1,则代表整棵树都不是平衡二叉树,因此我们可以自底向上递归来求每棵树的高度,比较它两颗子树的高度差是否满足条件,满足则返回合法的高度,否则返回-1

代码实现(C++11)

class Solution {
public:
    bool IsBalanced_Solution(TreeNode* pRoot) {
        return dfs(pRoot) != -1;
    }

    int dfs(TreeNode* root){
        if(!root) return 0;
        int left = dfs(root->left);
        if(left == -1) return -1;
        int right = dfs(root->right);
        if(right == -1) return -1;
        return abs(left - right) > 1 ? -1 : max(left, right) + 1;
    }
};

时间复杂度:O(n)
空间复杂度:O(n)