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

Posted 每日一算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断一棵树是否为平衡二叉树相关的知识,希望对你有一定的参考价值。

每天思考一点点,每天进步一点点!以后的你终将感谢现在努力的你


判断一棵树是否为平衡二叉树
记录生活


题目
判断一棵树是否为平衡二叉树

给定一棵树的头节点head,判断这棵树是否为平衡二叉树。


要求

1:如果二叉树的节点数是N,时间复杂度为O(N)


解答
判断一棵树是否为平衡二叉树

首先来了解下什么是平衡二叉树,平衡二叉树的特点是要么是一棵空树,要么任何一个节点的左右子树的高度差的绝对值不超过1,如果超过1,那么这棵树就不是平衡二叉树


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


上面这个图就不是平衡二叉树,因为它们左子树最大相差2。


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


上面的这个图就是平衡二叉树,因为它们的最大值相差1。


下面我们来理一下思路


根据前一篇文章的详细解答,我们知道了前序遍历,中序遍历和后序遍历的知识,那么我们是否可以通过应用上一章节的知识来解答今天的问题呢?


答案是可以的,假若使用前序遍历,那么根据它的特点,我们会从上往下遍历左右子树,直至全部遍历完成。若使用后序遍历,我们可以先遍历左子树,若不满足条件,那么直接返回,如果符合条件,我们才会开始遍历右子树。通过上面的比较,我们发现后序遍历比前序遍历的时间复杂度要好的多,至少在左子树出现不平衡的情况时我们不需要遍历右子树了。


那么具体怎么做呢?


a)对于任何一个节点node,先遍历左子树,判断左子树是否是平衡二叉树,同时记录当前的深度leftHeight。


b)如果发现node的左子树已经不是平衡二叉树,那么退出循环。


c)如果node的左子树是平衡二叉树,那么我们再遍历node的右子树,遍历过程同样记录两个信息,一个是是否是平衡二叉树,一个是当前的深度rightHeight。


d)如果发现node的右子树不是平衡二叉树,那么也直接退出循环。


f)如果node的右子树是平衡二叉树,那么比较leftHeightrightHeight的绝对值,看它们是否大于1,如果大于1,说明这棵树不是平衡二叉树,如果小于等于1,说明这个棵是平衡二叉树,返回leftHeightrightHeight中最大的一个,至此比较完成。


在整个后序遍历的过程中,每个节点最多比较一次,如果中途发现不满足条件就立马返回,不需要再遍历其他的节点了,所以时间复杂度是O(N)


判断一棵树是否为平衡二叉树
代码


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


https://github.com/1260380285/suanfa/blob/yuanbing/src/com/IsBalance.java



更多精彩内容,请长按二维码




以上是关于判断一棵树是否为平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章

判断一个树是否为平衡二叉树

《剑指offer》:[39-1]判断是否为平衡二叉树

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

平衡二叉树的判断

LeetCode110. Balanced Binary Tree-判断是否为平衡二叉树

每日一道面试题-平衡二叉树的判断