面向考试的树、二叉树和森林
LZC Lv4

面向考试的树、二叉树和森林

树中结点数和度数的关系

  1. 树的结点数nn等于所有结点的度数之和加1

    nin_i表示度为ii的结点数量,nn为树的结点数。

    n=1+n1+2n2+3n3+...+nnn=n0+n1+...+n0n = 1+n_1+2n_2+3n_3+...+n*n_n=n_0+n_1+...+n_0

  2. 度为mm的树中第ii层上至多有mi1m^{i-1}个结点(i1)(i\ge1)

    第1层至多1个结点(即根结点),第2层至多有mm个结点,第3层至多有m2m^2个结点。

    使用数学归纳法可推出第ii层至多有mi1m^{i-1}个结点

  3. 高度为hhmm叉树至多有(mh1)/(m1)(m^h -1)/(m-1)个结点

题型

在一棵度为3的树中,度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为( )。

1+n1+2n2+3n3=1+2+2+6=111+n_1+2n_2+3n_3=1+2+2+6=11n0+n1+n2+n3=11n_0+n_1+n_2+n_3 = 11,因此n0=6n_0=6.

思考:若此题推广至求nin_i,当如何?

例如将上题改为:在一棵度为3的树中,度为0的结点数为6个,度为2的结点数为1个,度为1的结点数为2个,则度为3的结点数()

1+n1+2n2+3n3=3n3+5=n1+n_1+2n_2+3n_3=3n_3+5=n

n0+n1+n2+n3=9+n3=nn_0+n_1+n_2+n_3 = 9+n_3=n,联立可得n3=2n_3 = 2


二叉树(重点)

二叉树的性质

非空二叉树上的叶结点数等于度为2的结点数加1,即n0=n2+1n_0=n_2+1

非空二叉树的第kk层最多有2k1个结点(k1)2^{k-1}个结点(k\ge1)

高度为hh的二叉树至多有2h12^h-1个结点(h1)(h\ge1)

完全二叉树的性质

完全二叉树按从上到下、从左到右的顺序依次编号1,2,…,n,则有以下关系:

  1. in2i\le \lfloor \frac n 2\rfloor,则结点ii为分支结点,否则为叶结点,即最后一个分支结点的编号为n2\lfloor \frac n 2 \rfloor
  2. 叶结点只可能在层次最大的两层上出现
  3. 若有度为1的结点,则只可能有一个,且该结点只有左孩子而无右孩子(度为1的分支结点只可能是最后一个分支结点,其结点编号为n2\lfloor \frac n2\rfloor)。
  4. 按层序编号后,一旦出现某结点(如结点ii)为叶结点或只有左孩子的情况,则编号大于ii的结点均为叶结点(与上述1和3相通)
  5. nn为奇数,则每个分支结点都有左、右孩子;若nn为偶数,则编号最大的分支结点(编号为n2\frac n2)只有左孩子,没有右孩子,其余分支结点都有左、右孩子
  6. i>1i \gt 1时,结点ii的双亲结点的编号为i2\lfloor \frac i2\rfloor
  7. 若结点ii有左、右孩子,则左孩子编号为2i2i,右孩子编号为2i+12i+1
  8. 结点ii所在层次(深度)为log2i+1\lfloor\log_2i\rfloor+1

具有nn个(n>0n\gt 0)结点的完全二叉树的高度为log2(n+1)\lceil \log_2(n+1)\rceillog2n+1\lfloor \log_2n\rfloor + 1

题型

序序列为a,b,c,d的不同二叉树的个数是:

因为先序序列和中序序列可以唯一地确定一棵二叉树,并且题目已经给出先序序列,因此只要知道由该先序序列可以确定多少个中序序列即可。

两个重要的公式:

  1. 先序序列和中序序列的关系:以先序序列入栈,则出栈序列必为中序序列。
  2. 一个入栈顺序可以确定的出栈顺序的组合数为\frac{1}{n+1}\C^n_{2n},即卡特兰数。

线索二叉树

二叉树会产生两个问题:

  1. 在n个结点的二叉树中,必然有n+1个空链域(叶结点的左右子树空间浪费)
  2. 二叉树的遍历,无论是递归或非递归,效率都不高

线索化就是利用浪费的空间去解决效率问题。

线索二叉树是一种物理结构。

线索化

将某结点的空指针域指向该结点的前驱后继,规则如下:

  • 若结点的左子树为空,则该结点的左孩子指针指向其前驱结点
  • 若结点的右子树为空,则该结点的右孩子指针指向其后继结点

这种指向前驱和后继的指针称之为线索,将二叉树按某种次序遍历,并按规则添加线索的过程称之为线索化

添加标志位,以区分子指针指向孩子或前驱/后继结点,规则如下:

  • ltag == 0,指向左孩子;ltag == 1,指向前驱结点
  • rtag == 0,指向右孩子;rtag == 1,指向后继结点

森林