[二叉搜索树]leetcode110:平衡二叉树(easy)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43152052/article/details/100182767

题目:
在这里插入图片描述

题解:
直接暴力求出左右子树的高度,然后比较高度差而且同时也要递归判断左右子树是否为平衡二叉树

代码如下:

class Solution {
public:
    //解法1:自顶向下,由于递归会对大量的节点访问和计算,所以时间复杂度最差为O(n^2),空间复杂度为O(1)
    bool isBalanced(TreeNode* root) {
        if(root==nullptr)return true;
        /*else return abs(countFloors(root->left)-countFloors(root->right))<2&&isBalanced(root->left)&&isBalanced(root->right);*/
        if(abs(countFloors(root->left)-countFloors(root->right))>1)return false;//左右子树的高度差要小于等于1
        else{
            if(isBalanced(root->left)&&isBalanced(root->right))return true;//左右子树都是平衡的
            return false;
        }
    }
    
    int countFloors(TreeNode* root)
    {
        if(root==nullptr)return 0;
        else return 1+max(countFloors(root->left),countFloors(root->right));
    }
    
    
    //解法二:自底向上,时间复杂度为O(n),空间复杂度为O(1)
private:
    bool result=true;
public:
    bool isBalanced(TreeNode* root)
    {
        helper(root);
        return result;
    }
    int helper(TreeNode* root)
    {
        if(root==nullptr)return 0;
        int left=1+helper(root->left);//计算左子树的深度,或者左右子树中的某颗二叉树的左子树深度
        int right=1+helper(root->right);//计算右子树的深度,同左子树
        if(abs(left-right)>1)result=false;//高度差大于1表示不是高度平衡二叉树
        return max(left,right);//返回的左子树或者右子树中的一个二叉树的左右子树的最大高度
    }
    
};

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/100182767