【题目】
【分析】 什么是平衡二叉树。就是每一个结点的左右子树的高度差不超过1。
【方法】 怎么求呢?一个很正常的想法是:首先判断左子树是不是平衡二叉树,然后判断右子树是不是平衡二叉树,最后确定自己是不是平衡二叉树。
代码:
结果:
结果不太好。
【改进】 为什么不好呢?因为在判断的每一个节点是否是二叉树的时候,都要递归求一遍它的高度。 明明求高度只需要一遍就好了。
怎么改进呢?我们来分析一下求高度的方法。
求高度的方法也是通过递归实现的,首先求左子树的高度,然后求右子树的高度,最后得到自己的高度。 我们可以在求完左右子树的高度之后,判断一下左右子树的高度差是否超过1。这样当求完root的高度的时候,刚好从底往上都判断了一遍左右子树的高度差。
代码如下:
我们使用了一个全局变量来标记是不是平衡二叉树。当有一个节点的左右子树高度差不满足条件就设为false。
结果:
结果又快了一步了。
【继续改进】 但是刚才的代码还是有一个小问题。一旦将ret设为false之后,整个程序的结果就有了。不需要再继续判断父节点,父父节点...这些了。
怎么能中断一个递归函数呢?我能想到的抛出异常的方法。
代码:
结果:
结果更不好了。。。看来通过异常的方法很慢。。。
既然没办法直接退出递归,那我只能退而求其次,一层一层退出递归了。因为我的本意并不是求树的高度,我只是在求树的高度的时候达到我判断是平衡树的目的。所以一旦确定不是平衡二叉树了,我也就不关心树的高度了。所以呢,当不是平衡二叉树的时候,我就直接返回高度是0,这样就省去了求高度的时间。
代码:
结果:
只比刚才的代码多了一句话,速度就上去了。
|