题解 | #平衡二叉树#

平衡二叉树

http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222

一、题目描述

题目大意:输入一棵二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(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)

全部评论

相关推荐

2025-12-19 19:02
西安交通大学 Java
程序员牛肉:双九,而且还是西交这种比较好的985九没必要再投日常了。你投中小厂,人家会觉得你学历这么顶还面试肯定是海投的,过了你也不去。所以不约你了。 直接准备暑期实习就好,现在你可以面试。但是目的不再是去日常实习了,而是熟悉面试节奏。 后续把精力放到八股,算法和AI知识上。抽空把自己这两个项目换了,怎么选项目可以看看我主页写的文章。 你学历不错的,不要焦虑
那些拿到大厂offer的...
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务