【算法】(简单题)力扣NO.110二叉树算法题——平衡二叉树


题目

给定一个二叉树,判断它是否是高度平衡的二叉树
在这里插入图片描述
在这里插入图片描述


题目补充

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。


思路

方法一:
如果在刚写完二叉树的深度的情况下,应该很容易能联想到。只要分别求两棵子树的深度,再比较一下它们的差值,如果不超过1,那么这棵二叉树就是高度平衡的二叉树了。

方法二:
方法一会有一种弊端,例如:
在这里插入图片描述
这棵二叉树我们从肉眼能看出它 相当不平衡 了,但是代码仍然需要遍历完全部节点才能知道结果,会造成很多的浪费。所以我们需要提前终止递归。
方法一是一种至上而下的遍历方法,方法二我们采用自下而上的遍历方法。
如果我们发现有一棵子树已经不是高平衡二叉树了,那么就终止递归。


代码实现

方法一

	/**
     * 平衡二叉树 从顶至底 比较暴力
     * @param root
     * @return
     */
    public boolean isBalanced(TreeNode root) {
        if(root == null) return true;
        int leftDepth = maxDepth(root.left); //获得左孩子深度
        int rightDepth = maxDepth(root.right); //获得右子树深度
        //如果深度差大于1返回false 进行递归判断左右孩子的深度差
        return Math.abs(leftDepth-rightDepth) > 1 ? false:true && isBalanced(root.left) &&isBalanced(root.right);
    }

方法二

/**
     * 平衡二叉树 从底至顶 效率最好
     * @param root
     * @return
     */
    public boolean isBalanced(TreeNode root){
        return recur(root) != -1;
    }

    private int recur(TreeNode root){
        if(root == null) return 0; //如果根节点为null,递归结束,当前节点深度为0
        int leftDepth = recur(root.left); //递归 获得当前节点左孩子的深度
        if(leftDepth == -1) return -1; //发现左子树已经为非平衡,提前结束递归
        int rightDepth = recur(root.right); //递归 获得当前节点右孩子的深度
        if(rightDepth == -1 ) return -1; //发现右子树已经为非平衡,提前结束递归
        //判断左子树和右子树的深度差,若不是平衡二叉树,返回-1;否则返回二叉树深度
        return Math.abs(leftDepth-rightDepth) > 1 ? -1 : Math.max(leftDepth,rightDepth) + 1;
    }

总结

第一次能很快的写出暴力递归了,蛮兴奋的,但是写的时候也会觉得:诶?感觉时间复杂度好高咧。和之前的题很像但也不是一种算法,很妙,多多学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值