面向考试的树、二叉树和森林
面向考试的树、二叉树和森林
树
树中结点数和度数的关系
-
树的结点数等于所有结点的度数之和加1
以表示度为的结点数量,为树的结点数。
-
度为的树中第层上至多有个结点
第1层至多1个结点(即根结点),第2层至多有个结点,第3层至多有个结点。
使用数学归纳法可推出第层至多有个结点
-
高度为的叉树至多有个结点
题型
在一棵度为3的树中,度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为( )。
,,因此.
思考:若此题推广至求,当如何?
例如将上题改为:在一棵度为3的树中,度为0的结点数为6个,度为2的结点数为1个,度为1的结点数为2个,则度为3的结点数()
,联立可得。
二叉树(重点)
二叉树的性质
非空二叉树上的叶结点数等于度为2的结点数加1,即。
非空二叉树的第层最多有。
高度为的二叉树至多有个结点。
完全二叉树的性质
对完全二叉树按从上到下、从左到右的顺序依次编号1,2,…,n,则有以下关系:
- 若,则结点为分支结点,否则为叶结点,即最后一个分支结点的编号为。
- 叶结点只可能在层次最大的两层上出现
- 若有度为1的结点,则只可能有一个,且该结点只有左孩子而无右孩子(度为1的分支结点只可能是最后一个分支结点,其结点编号为)。
- 按层序编号后,一旦出现某结点(如结点)为叶结点或只有左孩子的情况,则编号大于的结点均为叶结点(与上述1和3相通)
- 若为奇数,则每个分支结点都有左、右孩子;若为偶数,则编号最大的分支结点(编号为)只有左孩子,没有右孩子,其余分支结点都有左、右孩子
- 当时,结点的双亲结点的编号为。
- 若结点有左、右孩子,则左孩子编号为,右孩子编号为
- 结点所在层次(深度)为
具有个()结点的完全二叉树的高度为或
题型
先序序列为a,b,c,d
的不同二叉树的个数是:
因为先序序列和中序序列可以唯一地确定一棵二叉树,并且题目已经给出先序序列,因此只要知道由该先序序列可以确定多少个中序序列即可。
两个重要的公式:
- 先序序列和中序序列的关系:以先序序列入栈,则出栈序列必为中序序列。
- 一个入栈顺序可以确定的出栈顺序的组合数为\frac{1}{n+1}\C^n_{2n},即卡特兰数。
线索二叉树
二叉树会产生两个问题:
- 在n个结点的二叉树中,必然有n+1个空链域(叶结点的左右子树空间浪费)
- 二叉树的遍历,无论是递归或非递归,效率都不高
而线索化就是利用浪费的空间去解决效率问题。
线索二叉树是一种物理结构。
线索化
将某结点的空指针域指向该结点的前驱后继,规则如下:
- 若结点的左子树为空,则该结点的左孩子指针指向其前驱结点
- 若结点的右子树为空,则该结点的右孩子指针指向其后继结点
这种指向前驱和后继的指针称之为线索,将二叉树按某种次序遍历,并按规则添加线索的过程称之为线索化。
添加标志位,以区分子指针指向孩子或前驱/后继结点,规则如下:
- ltag == 0,指向左孩子;ltag == 1,指向前驱结点
- rtag == 0,指向右孩子;rtag == 1,指向后继结点