完全二叉树¶
1. 定义性质¶
完全二叉树满足:
除了最后一层,前面每一层都必须填满;最后一层的结点必须从左到右连续排列。
也就是说:
2. 层序位置连续¶
如果按层序给二叉树的位置编号:
那么一棵有 n 个结点的完全二叉树,结点必须占据:
不能跳号。
例如:
不是完全二叉树,因为位置 6 空了,却出现了位置 7。
3. 不能有右儿子但没有左儿子¶
如果一个结点出现:
那么这棵树一定不是完全二叉树。
例如:
不是完全二叉树。
4. 左子树高度不能小于右子树高度¶
完全二叉树中,左边不能比右边矮。
所以必须满足:
如果:
一定不是完全二叉树。
5. 左右子树高度差最多为 1¶
完全二叉树中,左右子树高度差只能是:
或者:
不能是负数,也不能大于 1。
也就是:
或:
6. 左右高度相等时:左满,右完全¶
如果:
那么当前树要成为完全二叉树,需要满足:
也就是:
原因:右边已经长到和左边一样高了,左边必须已经填满。
7. 左子树比右子树高 1 时:左完全,右满¶
如果:
那么当前树要成为完全二叉树,需要满足:
也就是:
原因:左边可以继续向下一层生长,但右边必须已经完整填满,不能有缺口。
8. 满二叉树一定是完全二叉树¶
满二叉树:
完全二叉树:
所以:
9. 算法判断时常用的三个量¶
判断一棵子树是否是完全二叉树,常维护三个信息:
空子树通常可以看作:
这样递推会更方便。
10. 最核心的两条递推判断¶
对于结点 u,设左儿子为 l,右儿子为 r。
情况一:左右高度相等
则 u 的子树是完全二叉树。
情况二:左边比右边高 1
则 u 的子树是完全二叉树。