判断平衡二叉树

题目详情

       输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

示例

给定二叉树 [3,9,20,null,null,15,7]

   3
  /  \
 9  20
     /  \
   15 7

返回true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

参考题解:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/solution/mian-shi-ti-55-ii-ping-heng-er-cha-shu-cong-di-zhi/

若此树是平衡二叉树,则所有结点都需要满足其左右子树的深度相差不超过1,否则就不是;而结点所在的深度=max(左子树的深度, 右子树的深度)+1;

方法一:先序遍历(自顶向下)

思路: 构造一个函数High(root)用于获取当前树的深度,再通过调用该函数获取某子树的左右子树的高度,然后进行比较深度差abs(High(root->left) - High(root->right)) <=1是否成立,判断该子树是不是平衡二叉树,若所有子树都是平衡二叉树,则此树是平衡二叉树。
流程:

High(root)函数:   递归计算root的深度

  • 终止条件: root为空;
  • 返回值: 返回左右子树的最大深度+1;

isBalanced(root) 函数: 判断root是不是平衡二叉树

  • 特值处理: root为空,返回true;
  • 返回值: 所有子树都需要满足平衡二叉树,所以同时满足下面三个条件,用&&连接
    1. abs(High(root->left) - High(root->right)) <=1: 判断当前子树是否是平衡二叉树;
    2. isBalanced(root->left) : 判断当前子树的左子树是否是平衡二叉树;
    3. isBalanced(root->right): 判断当前子树的右子树是否是平衡二叉树。
    主要代码:
 bool isBalanced(TreeNode* root) {
    if(!root)
        return true;
    if(abs(High(root->left)-High(root->right)) <= 1 
       && isBalanced(root->left) && isBalanced(root->right))
        return true;
    return false;
}

int High(TreeNode* root)
{
    if(!root)
        return 0;
    return max(High(root -> left), High(root -> right))+1;
}
方法二:后序遍历(自底向上)

思路: 对树进行后序遍历,自底向上返回子树的深度,判断子树是否是平衡二叉树,若不是,则向上返回-1,进行剪枝
流程:
recur(root) 函数: 返回-1或者树的深度

  • 终止条件:
  1. root为空;
  2. 左(右)子树深度为-1,即此树不为平衡二叉树,同时直接返回-1;
  • 返回值:
  1. 当结点root的左右子树的深度差<=1,则返回该子树的深度;
  2. 当结点root的左右子树的深度差>1,则直接返回-1。

isBalanced(root) 函数: 判断root是不是平衡二叉树

  • 返回值:
    recur(root)!=-1时,表示root是平衡二叉树,则返回true,否则返回false;

主要代码:

bool isBalanced(TreeNode* root) {
        if(cur(root) != -1)  return true;
        return false;
    }
    int cur(TreeNode* root)
    {
        if(!root)  return 0;
        int le = cur(root -> left);
        if(le == -1)  return -1;

        int ri = cur(root -> right);
        if(ri == -1)  return -1;
        
        if(abs(le - ri) <= 1)
            return max(le, ri)+1;
        else
            return -1;
    }
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值