牛客热题:判断是否是平衡二叉树

📟作者主页:慢热的陕西人

🌴专栏链接:力扣刷题日记

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

在这里插入图片描述

牛客热题:判断是否是平衡二叉树

题目链接

判断是不是平衡二叉树_牛客题霸_牛客网 (nowcoder.com)

方法一:辅助函数+递归

思路

代码

    int _Isheight(TreeNode* root)
    {
        if(root == nullptr) return 0;
        int l = 0; 
        int r = 0;
        if(root->left) l = _Isheight(root->left);
        if(root->right) r = _Isheight(root->right);

        return (l > r ? l : r) + 1;
    }
    
    bool IsBalanced_Solution(TreeNode* pRoot) 
    {
        if(pRoot == nullptr) return true;
        //看看当前的树是否是平衡树
        int l = _Isheight(pRoot->left);
        int r = _Isheight(pRoot->right);
        //若是则继续看子树
        if(abs(l - r) <= 1)
        return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right);
        //否则的话直接返回false
        else 
        return false;
    }

复杂度

这段代码主要是用来判断一棵二叉树是否是平衡二叉树的。对于时间复杂度和空间复杂度的分析如下:

  1. 时间复杂度:
    • _Isheight 函数的时间复杂度为 O(n),其中 n 是树的节点数,因为在每个节点上都会进行用。
    • IsBalanced_Solution 函数中,每个节点的高度计算调用了 _Isheight 函数两次(分别计算左子树和右子树的高度),所以时间复杂度为 O(2n),即 O(n)。
    • 因为在递归调用过程中没有额外的数据结构占用空间,所以空度为 O(1),即常量级空间复杂度。
  2. 简要分析:
    • _Isheight 函数用来计算树的高度,时间复杂度为 O(n),空间复杂度为 O(h), 其中h为树的高度,用于建立函数栈帧的开销。
    • IsBalanced_Solution 函数在杂度为 O(h),h为树的高度,用于建立函数栈帧的开销。

方法二:回溯

思路

  1. deep 函数用来计算以 node 为根节点的子树的深度。
  2. 如果当前节点为空,则该子树深度为 0,返回 0。
  3. 分别递归计算左子树和右子树的深度,得到 leftright
  4. 如果左子树或右子树深度为 -1,说明左子树或右子树不平衡,直接返回 -1。
  5. 如果左子树和右子树深度之差大于 1,说明当前子树不平衡,直接返回 -1。
  6. 如果左子树和右子树深度之差小于等于 1,说明当前子树平衡,返回左右子树深度的较大值加上 1。
  7. IsBalanced_Solution 函数中,如果根节点的深度为 -1,则说明整棵树不平衡,返回 false;否则返回 true,表示整棵树平衡。

代码

    bool IsBalanced_Solution(TreeNode* pRoot) 
    {
        if(deep(pRoot)==-1) return false;
        return true;  
    }

    int deep(TreeNode* node)
    {
        if(node == nullptr) return 0;
        int left=deep(node->left);
        if(left == -1 ) return -1;
        int right=deep(node->right);
        if(right == -1 ) return -1;
 
        //两个子节点深度之差小于一
        if((left-right)>1 || (right-left)>1){
            return -1;
        }
        //父节点需要向自己的父节点报告自己的深度
        return (left>right?left:right)+1;
    }

复杂度

时间复杂度:O(n)

空间复杂度: O(n),因为需要递归调用的栈空间。

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小米睡不醒.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值