1、有向树:若有向图
的基图是无向树,则称
为有向树。
2、若有向树
是平凡树,或
中有一个顶点入度为
,其余顶点入度为
,则称
为有根树。入度为
的点称树根,入度为
出度为
的点称树叶,入度为
出度不为
的点称内点,内点和根统称分支点。树中点
的层数定义为从树根到
的路径(容易证明该路径必然存在)长度,层数最大的顶点的层数称树高。
3、设
为一棵根树,
,若
可达
,称
是
的祖先,
是
的后代;若
邻接到
,则称
是
的父亲,
是
的儿子;若
和
父亲相同,称
和
互为兄弟。
4、设
是一棵根树,若将
的同层数的顶点标上次序,则称
为有序树。
5、设
是一棵根树,若
的每个分支点至多有
个儿子,称
为
叉树;若每个分支点恰好有
个儿子,称
为
叉正则树(proper tree)。
计算机里我们主要考虑的是”二叉树“,也就是有序的二叉根树。我们考虑它的诸多性质:
1、二叉树的第
层上最多有
个节点,其中
。
证明:当
时显然。设当
时结论成立。则
时,由于第
层至多有
个节点,而每个节点最多两个孩子,所以第
层最多
个节点。由数学归纳法,结论成立。
2、高度为
的二叉树最多含
个节点。
证明:由1,每一层我们取最大值,则高度为
的二叉树最多含的节点数为
个节点。
3、任何一个二叉树,如果含
个叶子节点,
个度为
的节点,则必然有
。这里的度指的是根树里的出度。
证明:设度为
的节点个数为
,则二叉树节点总个数
,二叉树的边数为
,由于在二叉树里,边数等于顶点数减
,所以
所以
。
定义:
1、满二叉树(full binary tree):深度为
且含
个节点的二叉树。
2、完全二叉树(complete binary tree):将某个满二叉树按照层序遍历对每个节点编号。对于某个树,如果存在某个满二叉树,使得该树的
个节点和满二叉树中编号为
到
的节点一一对应,称此树为完全二叉树。
性质:
一个具有
个节点的完全二叉树的深度为
。
证明:设某完全二叉树深度为
,则
,也可以写为
,所以
,所以
。
接下来,对于含有
个节点的完全二叉树,我们考虑它的亲子的下标的关系。为了研究二叉堆的方便,我们将编号变为从
开始。
性质:
1、如果节点
有左孩子,那么其左孩子的下标为
,且
。如果节点
有右孩子,那么其右孩子的下标为
,且
。如果节点
非根节点,则其父亲为
。
证明:数学归纳法。先证前两个性质。如果
,显然成立。假设当
时成立。对于
时,由于
有左孩子,所以那么节点
也必然有左孩子,否则二叉树无法complete。既然节点
的左孩子是
,所以
的左孩子是
。由数学归纳法,结论成立。右孩子的情况类似可证。最后一条性质可以由前两条证明出来。
2、给定一个数组,对其堆化,时间复杂度是
。
证明:首先考虑堆化是个什么样的过程。我们先对二叉堆的最后一层开始,每次从当前层到下面的层堆化每一个小部分,直到堆化到第一层即可。
先从倒数第一层开始,将最后的每个叶子看作一个小型的堆,那么这些元素都不需要percolate。再看倒数第二层,将此层每个节点连同它们的后代做堆化,则每个堆顶至多需要比较
次,也就是分别和左右孩子各比较
次。再看倒数第三层,每个堆顶要percolate down的话,最多需要比较
次,也就是每次sift down一次,就要比较两次。一般地,倒数第
层,就需要比较
次。设二叉堆总共有
层,则倒数第
层最多有
个节点,所以堆化的时间复杂度为
设
则
两式相减,得:
所以
而
,所以时间复杂度是
,其中
为二叉树节点数。
3、给定一个空堆,向其逐次添加
个元素,则建堆过程复杂度为
。
证明:显然第
层元素percolate up的次数最多是
,所以如果二叉堆有
层,所花时间
而
,所以时间复杂度为
。