一、解释
堆通常是一个可以被看做一棵树的数组对象。所以在认识堆之前,我们先来了解了解满二叉树和完全二叉树,这样在后面做堆问题时会有很大帮助。
满二叉树:对于满二叉树的定义呢,国内和国外有所不同。本篇博文中按照国内定义。
满二叉树定义:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。即一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
示例:
满二叉树满足如下性质(都可以通过数学归纳的方法证明,有兴趣的可以自己试试):
1、一个层数为k 的满二叉树总结点数为: 。因此满二叉树的结点树一定是奇数个。
2、第i层上的结点数为:
3、一个层数为k的满二叉树的叶子结点个数(也就是最后一层):
4、i位置元素的父节点位置为 i-1/2 左孩子节点位置为:2*i+1 右孩子结点位置为:2*i+2
完全二叉树:
定义:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。
示例:
可以看出,满二叉树实际上是一个特殊的完全二叉树。