110  判断一棵树是否是平衡二叉树

                                                                                                                                               点击此处返回总目录

 

 

【题目】

 

【分析】

什么是平衡二叉树。就是每一个结点的左右子树的高度差不超过1。

 

【方法】

怎么求呢?一个很正常的想法是:首先判断左子树是不是平衡二叉树,然后判断右子树是不是平衡二叉树,最后确定自己是不是平衡二叉树。

 

 

代码:

 

结果:

 

 

结果不太好。

 

 

【改进】

为什么不好呢?因为在判断的每一个节点是否是二叉树的时候,都要递归求一遍它的高度。

明明求高度只需要一遍就好了。

 

怎么改进呢?我们来分析一下求高度的方法。

 

求高度的方法也是通过递归实现的,首先求左子树的高度,然后求右子树的高度,最后得到自己的高度。

我们可以在求完左右子树的高度之后,判断一下左右子树的高度差是否超过1。这样当求完root的高度的时候,刚好从底往上都判断了一遍左右子树的高度差。

 

代码如下:

 

我们使用了一个全局变量来标记是不是平衡二叉树。当有一个节点的左右子树高度差不满足条件就设为false。

 

结果:

 

结果又快了一步了。

 

【继续改进】

但是刚才的代码还是有一个小问题。一旦将ret设为false之后,整个程序的结果就有了。不需要再继续判断父节点,父父节点...这些了。

 

怎么能中断一个递归函数呢?我能想到的抛出异常的方法。

 

代码:

 

结果:

 

结果更不好了。。。看来通过异常的方法很慢。。。

 

既然没办法直接退出递归,那我只能退而求其次,一层一层退出递归了。因为我的本意并不是求树的高度,我只是在求树的高度的时候达到我判断是平衡树的目的。所以一旦确定不是平衡二叉树了,我也就不关心树的高度了。所以呢,当不是平衡二叉树的时候,我就直接返回高度是0,这样就省去了求高度的时间。

 

代码:

 

结果:

 

只比刚才的代码多了一句话,速度就上去了。

 

 

 

 

 

 

 

 

  • 27
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值