代码随想录第17天 | 110.平衡二叉树

110.平衡二叉树 

110. 平衡二叉树 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树_哔哩哔哩_bilibili

给定一个二叉树,判断它是否是 

平衡二叉树

  

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000] 内
  • -104 <= Node.val <= 104

第一反应是应用昨天学到的二叉树的最大深度和最小深度,求两者之差,与1比较,<=1则是平衡二叉树,大于1则不是平衡二叉树。

但看了卡哥的视频,发现自己有很多考虑不太周道的地方。

平衡二叉树的含义是:该二叉树的所有节点的左右子树的高度差相差不超过1。

如果有节点的左右子树的高度差超过1,则返回-1,说明这棵二叉树已经不是平衡二叉树。

理想的遍历状态如下:

左右中   搜集左右孩子节点的信息后,需要把信息返回给中间节点,然后中间节点再接着把信息向上传递,所以适合后序遍历的方式

用递归的方式来进行后续遍历:

递归三部曲:

1、确定函数的参数和返回值:

参数是传入的根节点,返回值是:以当前传入的节点为根节点的树的高度   

注意:如果以当前传入的节点为根节点的树的高度>1,则这棵树就已经不是平衡二叉树了,返回-1

private int getHeight(TreeNode root){
    
}

2、确定返回条件:

if(root == null){
    return 0;
}

3、确定单层递归的逻辑:左右中:先计算左子树的高度,再计算右子树的高度,再计算两者之差,如果差大于1,则返回-1,表示这棵树不是平衡二叉树;如果差小于等于1,则返回左右子树的高度的最大值加1,表示当前节点的高度

int leftHeight = getHeight(root.left);
if(leftHeight == -1){
    return -1;
}
int rightHeight = getHeight(root.right);
if(rightHeight == -1){
    return -1;
}
if(Math.abs(leftHeight-rightHeight)>1){
    return -1;
}

return Math.max(leftHeight,rightHeight)+1;

综合代码:

class Solution {
    /**
     * 递归法
     */
    // 定义一个公共方法,用于判断给定的二叉树是否是平衡树
    public boolean isBalanced(TreeNode root) {
        // 调用 getHeight 方法来获取二叉树的高度,如果返回的高度不为 -1,则说明是平衡树,返回 true,否则返回 false
        return getHeight(root) != -1;
    }

    // 定义一个私有方法,用于获取二叉树的高度
    private int getHeight(TreeNode root) {
        // 如果根节点为空,返回高度为 0
        if (root == null) {
            return 0;
        }
        // 递归计算左子树的高度
        int leftHeight = getHeight(root.left);
        // 如果左子树的高度为 -1,表示左子树不平衡,直接返回 -1
        if (leftHeight == -1) {
            return -1;
        }
        // 递归计算右子树的高度
        int rightHeight = getHeight(root.right);
        // 如果右子树的高度为 -1,表示右子树不平衡,直接返回 -1
        if (rightHeight == -1) {
            return -1;
        }
        // 如果左右子树的高度差大于 1,表示不平衡,返回 -1
        if (Math.abs(leftHeight - rightHeight) > 1) {
            return -1;
        }
        // 返回左右子树中较大的高度加上根节点的高度
        return Math.max(leftHeight, rightHeight) + 1;
    }
}

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值