牛客BM36判断是不是平衡二叉树

输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。

平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

所以主要就是要求出树的高度

初思路:自下往上判断

参考了官方题解

jude递归到最底层,开始判断

深度计数怎么带回上一层递归的问题?

设置参数,并引用,这样每层都会累加深度,每层递归回来,都会带回自己的深度,然后进行判断。

abs函数用来求绝对值

class Solution {
public:
    //辅助递归函数
    //depth 添加引用,每层都会叠加
    bool judge(TreeNode* root, int& depth)
    {
        if(root == nullptr)
        {
            return true;
        }
        int left_depth = 0;
        int right_depth = 0;

        if(judge(root->left, left_depth) == false 
        || judge(root->right, right_depth) == false)
            return false;

        if(abs(left_depth - right_depth) > 1)
            return false;

        //更新当前层的depth
        depth = left_depth > right_depth ? left_depth + 1: right_depth + 1;

        return true;

    }


    bool IsBalanced_Solution(TreeNode* pRoot) 
    {
        int depth = 0;
        return judge(pRoot, depth);
    }



};

以子树为例的递归传递图

思路2:从上往下判断

两次递归:

1:求当前root的深度deep,采用递归函数int deep(TreeNode* root)

2:最上方第一个根节点的深度满足要求后,去递归根节点的左子树和右子树

因为deep函数在求深度递归的同时,并没有判断深度是否满足要求。

我们是在求完深度之后,才判断的。

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

        return (left > right ? left + 1: right + 1);
    }
bool IsBalanced_Solution(TreeNode* pRoot) {
    if(pRoot == nullptr)
        return true;
    int left = deep(pRoot->left);
    int right = deep(pRoot->right);

    if(abs(left - right) > 1)
        return false;

    //deep 只能求深度, 如果子树深度不满足,无法跳出
    return IsBalanced_Solution(pRoot->left)
        &&IsBalanced_Solution(pRoot->right);

    }

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值