【LeetCode】110.平衡二叉树(从底至顶,从顶至底 两种方法,java实现)

题目

链接

image-20200625001753133

分析:

根据定义,一棵二叉树 T存在节点pT,满足image-20200625001906291时,它是不平衡的。下图中每个节点的高度都被标记出来,高亮区域是一棵不平衡子树。

img

平衡子树暗示了一个事实,每棵子树也是一个子问题。
现在的问题是:按照什么顺序处理这些子问题?

方法一:从底至顶(提前阻断)

此方法为本题的最优解法,但“从底至顶”的思路不易第一时间想到。

思路是对二叉树做先序遍历,从底至顶返回子树最大高度,若判定某子树不是平衡树则 “剪枝” ,直接向上返回。

算法流程:

recur(root):

  • 递归返回值:
    1. 当节点root 左 / 右子树的高度差 < 2 :则返回以节点root为根节点的子树的最大高度,即节点 root 的左右子树中最大高度(代表此节点root的高度)加 1。( max(left, right) + 1
    2. 当节点root 左 / 右子树的高度差 ≥2 :则返回 -1 ,代表 此子树不是平衡树
  • 递归终止条件:
    1. 当越过叶子节点时,返回高度 0;
    2. 当左(右)子树高度 left== -1 时,代表此子树的 左(右)子树 不是平衡树,因此直接返回 -1 ;

isBalanced(root)

  • 返回值:recur(root) != 1 ,则说明此树平衡,返回 true; 否则返回 false 。

代码:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值