LeetCode Java刷题笔记—110. 平衡二叉树

110. 平衡二叉树。这道题与剑指 Offer 55 - II. 平衡二叉树属于同一道题。

给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。说白了就是判断二叉树是不是平衡二叉树。

简单难度

这道题采用分治算法即可。所谓分治(Divide and Conquer)算法,就是先分别处理局部,再合并结果,分(divide)阶段将问题分成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"合并"在一起,即分而治之。

这里,我们首先递归到每个叶子节点,就是拆分,然后再返回,合并的时候再判断子树是否平衡,也就是左右子树的高度差是否大于1,如果有一个子树的两边节点高度差大于1,那么就是不平衡了。

这里使用小于0的-1表示不平衡,如果出现了-1,那么就一直返回-1,否则对当前树的高度取最大的子树高度+1,继续向上合并。

最后递归结束时,如果值小于0,那么就是不平衡的。

public boolean isBalanced( TreeNode root ){

   return depth( root ) >= 0;
}

public int depth( TreeNode root ){

   if( root == null ){
      return 0;
   }
   /*分 拆解*/
   int left = depth( root.left );
   int right = depth( root.right );
   /*治 合并*/
   //-1 表示不平衡
   //如果左右子树的深度绝对值差大于1,就说明不平衡。
   if( left < 0 || right < 0 || Math.abs( left - right ) > 1 ){
      return -1;
   }
   else{
      //左右子树的深度绝对值差不大于1,就说明平衡,那么返回当前树的最大高度
      return Math.max( left, right ) + 1;
   }
}

另一种简单的方法是使用一个全局标志位flag。

private boolean flag = true;

public boolean isBalanced(TreeNode root) {

    depth(root);
    return flag;
}

int depth(TreeNode root) {
    if (root == null) {
        return 0;
    }
    int left = depth(root.left);
    int right = depth(root.right);
    if (Math.abs(left - right) > 1) {
        flag = false;
    }
    return Math.max(left, right) + 1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘Java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值