1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-02-11 14:45:57 +08:00
Files
CS408/Data-Structrue/7-tree-ex.md
Didnelpsun 25423916c0 更新图
2021-09-26 23:39:13 +08:00

13 KiB
Raw Blame History

树习题

基本概念

例题 在一棵度为$4$的树$T$中,若有$20$个度为$4$的结点,$10$个度为$3$的结点,$1$个度为$2$的结点,$10$个度为$1$的结点,则树$T$的叶结点个数是()。

A.41

B.82

C.113

D.122

解:$B$。设树中度为$i$$i=0,1,2,3,4$)的结点数分别为$n_i$,树中结点总数为$n$,则$n$=分支数$+1$,而分支数又等于树中各结点的度之和,即$n=1+0n_0+n_1+2n_2+3n_3+4n_4=n_0+n_1+n_2+n_3+n_4$。依题意,$n_1+2n_2+3n_3+4n_4=10+2+30+80= 122$$n_1+n_2+n_3+n_4=10+1+10+20=41$,可得出$n_0=82$,即树$T$的叶结点的个数是$82$。

二叉树

二叉树性质

例题 下列关于二叉树的说法中,正确的是()。

$A.$度为$2$的有序树就是二叉树

$B.$含有$n$个结点的二叉树的高度\lfloor\log_2n\rfloor+1

$C.$在完全二叉树中,若一个结点没有左孩子,则它必是叶结点

$D.$在任意一棵非空二叉排序树中,删除某结点后又将其插入,则所得二叉排序树与删除前原二叉排序树相同

解:$C$。在二叉树中,若某个结点只有一个孩子,则这个孩子的左右次序是确定的,而在度为$2$的有序树中,若某个结点只有一个孩子,则这个孩子就无须区分其左右次序,$A$错误。选项$B$仅当是完全二叉树时才有意义,对于任意一棵二叉树,高度可能为$\lfloor\log_2n\rfloor+1\sim n$。在二叉排序树中插入结点时,一定插入在叶结点的位置,故若先删除分支结点再插入,则会导致二叉排序树的重构,其结果就不再相同,$D$错误。根据完全二叉树的定义,在完全二叉树中,若有度为$1$的结点,则只可能有一个,且该结点只有左孩子而无右孩子,选项$C$正确。

例题 设二叉树有$2n$个结点,且$m<n$,则不可能存在()的结点。

$A.n$个度为0

$B.2m$个度为0

$c.2m$个度为1

$D.2m$个度为2

解:$C$。由二叉树的性质可知$n_0=n_2+1$,结点总数$=2n=n_0+n_1+n_2=n_1+2n_2+1$,则$n_1=2(n-n_2)-1$,所以$n$为奇数,说明该二叉树中不可能有$2m$个度为$1$的结点。

例题 已知一棵完全二叉树的第$6$层(设根为第$1$层)有$8$个叶结点,则该完全二叉树的结点个数最多是()。

A.39

B.52

C.111

D.119

解:$C$。第$6$层有叶结点,完全二叉树的高度可能为$6$或$7$,显然树高为$7$时结点最多。完全二叉树与满二叉树相比,只是在最下一层的右边缺少了部分叶结点,而最后一层之上是个满二叉树,并且只有最后两层上有叶结点。若第$6$层上有$8$个叶结点,则前$6$层为满二叉树,而第$7$层缺失了$8\times2=16$个叶结点,故完全二叉树的结点个数最多为$2^7-1-16=111$。

例题 一棵有$124$个叶子结点的完全二叉树,最多有()个结点。

A.247

B.248

C.249

D.250

解:$B$。在非空的二叉树当中,由度为$0$和$2$的结点数的关系$n_0=n_2+1$可知$n_2=123$;总结点数$n=n_0+n_1+n_2=247+n_1$,其最大值为$248$(由于完全二叉树$n_1$的取值为$1$或$0$,当$n=1$时结点最多)。注意,由完全二叉树总结点数$n$的奇偶性可以确定$n_1$的值,但不能根据$n_0$来确定的$n_1$值。

二叉树遍历

序列遍历概念

例题 ()的遍历仍需要栈的支持。

$A.$前序线索树

$B.$中序线索树

$C.$后序线索树

$D.$所有线索树

解:$C$。前序遍历(中左右)、中序遍历(左中右)的最后访问的节点都是左或右叶节点,叶节点是没有子树的,所以两个指针域空出来了,可以存放线索指针用于回溯。但是后序遍历(左右中),最后访问的是子树的根节点,子树根节点的两个指针域都指向子树了,所以不能空出来存放线索信息,只能借助栈存储。

二叉树个数

例题 先序序列为$a,b,c,d$的不同二叉树的个数是()。

A.13

B.14

C.15

D.16

解:由于只有先序序列和中序序列才能确定一个二叉树,所以现在已知先序序列,要求多少个二叉树就要求中序序列能有多少个。由于二叉树遍历的递归算法可以由带有栈的非递归算法实现,所以栈可以将序列转换为二叉树。所以这个问题就等于入栈先序序列,出栈中序序列。这就是卡特兰数$\dfrac{1}{n+1}C_{2n}^n=\dfrac{1}{n+1}\dfrac{(2n)!}{n!\times n!}=\dfrac{1}{5}\dfrac{8!}{4!\times4!}=14$。

结点关系

例题 在二叉树中有两个结点$m$和$n$,若$m$是$n$的祖先,则使用()可以找到从$m$到$n$的路径。

$A.$先序遍历

$B.$中序遍历

$C.$后序遍历

$D.$层次遍历

解:$C$。首先无论是什么遍历方式都会是从左到右的顺序,所以最先找到的一定是左边的结点,最后找到的一定是右边的结点。$m$是$n$的祖先。先序遍历访问次序:左根右,当$n$在左边遍历时会找到$m$到$n$的路径,而当$n$在右边时,由于已经遍历完根节点和左子树,则根和左部分的结点没用了就会出栈(使用递归算法时函数数据由栈保存),则$m$就丢掉了,也就不能找到$m$到$n$的路径。同理中序遍历也是会丢掉根和左部分,若$n$在右边则会丢失路径。层次遍历每遍历都会丢掉根节点,所以也不能找到。而后序遍历最后遍历根结点,所以根结点会一直保留到子结点全部遍历完才会丢弃,则此时就能找到$n$到$m$的路径。

例题 若$X$是二叉中序线索树中一个有左孩子的结点,且$X$不为根,则$X$的前驱为()。

$A.X$的双亲

$B.X$的右子树中最左的结点

$C.X$的左子树中最右结点

$D.X$的左子树中最右叶结点

解:$C$。在二叉中序线索树中,某结点若有左孩子,则按照中序“左根右”的顺序,该结点的前驱结点为左子树中最右的一个结点(注意,并不一定是最右叶子结点)。

遍历序列

例题 在二叉树的前序序列、中序序列和后序序列中,所有叶子结点的先后顺序()。

$A.$都不相同

$B.$完全相同

$C.$前序和中序相同,而与后序不同

$D.$中序和后序相同,而与前序不同

解:$B$。在三种遍历方式中,访问左右子树的先后顺序是不变的,只是访问根结点的顺序不同,因此叶子结点的先后顺序完全相同。此外,读者可以采用特殊值法,画一个结点数为三的满二叉树,采用三种遍历方式来验证答案的正确性。

例题 若一棵二叉树的前序遍历序列和后序遍历序列分别为$1,2,3,4$和$4,3,2,1$,则该二叉树的中序遍历序列不会是()。

A.1,2,3,4

B.2,3,4,1

C.3,2,4,1

D.4,3,2,1

解:$C$。前序序列为$NLR$,后序序列为$LRN$,由于前序序列和后序序列刚好相反,故不可能存在一个结点同时有左右孩子,即二叉树的高度为$4$。$1$为根结点,由于根结点只能有左孩子(或右孩子),因此在中序序列中,$1$或在序列首或在序列尾,$A,B,C,D$皆满足要求。仅考虑以$1$的孩子结点$2$为根结点的子树,它也只能有左孩子(或右孩子),因此在中序序列中,$2$或在序列首或在序列尾,$A, B,D$皆满足要求,故选$C$。

树与森林

森林与树的转换

例题 利用二叉链表存储森林时,根结点的右指针是()。

$A.$指向最左兄弟

$B.$指向最右兄弟

$C.$一定为空

$D.$不一定为空

解:$D$。森林与二叉树具有对应关系,因此,我们存储森林时应先将森林转换成二叉树,转换的方法就是“左孩子右兄弟”,与树不同的是,若存在第二棵树,则二叉链表的根结点的右指针指向的是森林中的第二棵树的根结点。若此森林只有一棵树,则根结点的右指针为空。因此,右指针可能为空也可能不为空。

转换结点关系

例题 将森林转换为对应的二叉树,若在二叉树中,结点$u$是结点$v$的父结点的父结点,则在原来的森林中,$u$和$v$可能具有的关系是()。

.父子关系

Ⅱ.兄弟关系

Ⅲ.$u$的父结点与$v$的父结点是兄弟关系

$A.$只有Ⅱ

$B.$Ⅰ和Ⅱ

$C.$Ⅰ和Ⅲ

$D.$Ⅰ、Ⅱ和Ⅲ

解:$B$。森林与二叉树的转换规则为“左孩子右兄弟”。在最后生成的二叉树中,父子关系在对应的森林关系中可能是兄弟关系或原本就是父子关系。情形Ⅰ:若结点$v$是结点$u$的第二个孩子结点,在转换时,结点$v$就变成结点$u$的第一个孩子的右孩子,符合要求。情形Ⅱ:结点$u$和$v$是兄弟结点的关系,但二者之中还有一个兄弟结点$k$,转换后结点$v$就变为结点$k$的右孩子,而结点$k$则是结点$u$的右孩子,符合要求。情形Ⅲ:结点$v$的父结点要么是原先的父结点,要么是兄弟结点。若结点$u$的父结点与$v$的父结点是兄弟关系,则转换之后不可能出现结点$u$是结点$v$的父结点的父结点的情形。

结点数量

例题 设$F$是一个森林,$B$是由$F$变换来的二叉树。若$F$中有$n$个非终端结点,则$B$中右指针域为空的结点有()个。

A.n-1

B.n

C.n+1

D.n+2

解:$C$。根据森林与二叉树转换规则“左孩子右兄弟”。二叉树$B$中右指针域为空代表该结点没有兄弟结点。森林中每棵树的根结点从第二个开始依次连接到前一棵树的根的右孩子,因此最后一棵树的根结点的右指针为空。另外,每个非终端结点,其所有孩子结点在转换之后,最后一个孩子的右指针也为空,故树$B$中右指针域为空的结点有$n+1$个。

树的应用

二叉排序树

平衡二叉树

结点数

例题 含有$20$个结点的平衡二叉树的最大深度为()。

A.4

B.5

C.6

D.7

解:$C$。平衡二叉树结点数的递推公式为$n_0=0$$n_1=1$$n_2=2$$n_h=1+n_{h-1}+n_{h-2}$$h$为平衡二叉树高度,$n$为构造此高度的平衡二叉树所需的最少结点数)。通过递推公式可得,构造$5$层平衡二叉树至少需$12$个结点,构造$6$层至少需要$20$个结点。

平衡因子

例题 若将关键字$1,2,3,4,5,6,7$依次插入初始为空的平衡二叉树$T$,则$T$中平衡因子为$0$的分支结点的个数是()。

A.0

B.1

C.2

D.3

解:$D$。平衡因子为$0$的分支结点即树两边同样高度。根据平衡二叉树的构造过程可得这个平衡二叉树是满二叉树,结点为$2,4,6$。

哈夫曼树

例题 设哈夫曼编码的长度不超过$4$,若已对两个字符编码为$1$和$01$,则还最多可对()个字符编码。

A.2

B.3

C.4

D.5

解:$C$。在哈夫曼编码中,一个编码不能是任何其他编码的前缀。已对两个字符编码为$1$和$01$,则第一位第二位都只能是$0$。$3$位编码可能是$001$,对应的$4$位编码只能是$0000$和$0001$。$3$位编码也可能是$000$,对应的$4$位编码只能是$0010$和$0011$。若全采用$4$位编码,则可以为$0000,0001,0010,0011$。题中问的是最多,故选$C$。

例题 若度为$m$的哈夫曼树中,叶子结点个数为$n$,则非叶子结点的个数为()。

A.n-1

B.\lfloor n/m\rfloor-1

C.\lceil(n-1)/(m-1)\rceil

D.\lceil n/(m-1)\rceil-1

解:$C$。一棵度为$m$的哈夫曼树应只有度为$0$和$m$的结点,设度为$m$的结点(叶子结点)有$n_m$个,度为$0$的结点有$n_0$个,又设结点总数为$n$$n=n_0+n_m$。因有$n$个结点的哈夫曼树有$n-1$条分支,则根据总结点与度数关系的公式($n=n_1+2n_2+\cdots+mn_m+1$)得到$mn_m=n-1=n_m+n_0-1$,整理得$(m-1)n_m=n_0-1$$n_m=(n-1)/(m-1)$。

例题 在任意一棵非空平衡二叉树($AVL$树)$T_1$中,删除某结点$v$之后形成平衡二叉树$T_2$,再将$v$插入$T_2$,形成平衡二叉树$T_2$。下列关于$T_1$与$T_3$的叙述中,正确的是()。

.若$v$是$T$的叶结点,则$T_1$与$T_3$可能不相同

Ⅱ.若$v$不是$T$的叶结点,则$T_1$与$T_3$一定不相同

Ⅲ.若$v$不是$T$的叶结点,则$T_1$与$T_3$一定相同

$A.$仅Ⅰ

$B.$仅Ⅱ

$C.$仅Ⅰ、Ⅱ

$D.$仅Ⅰ、Ⅲ

解:$A$。在非空平衡二叉树中插入结点,在失去平衡调整前,一定插入在叶结点的位置。若删除的是$T_1$的叶结点,则删除后平衡二叉树不会失去平衡,即不会发生调整,再插入此结点得到的二叉平衡树$T_1$与$T_3$相同。若删除后平衡二叉树失去平衡而发生调整,再插入结点得到的二叉平衡树$T_1$与$T_3$可能不同,如一个平衡树的一个子树只有一个结点,删除这个结点则平衡树必然失衡,肯定会重新调整。Ⅰ正确。若$v$不是$T$的叶结点,则删除可能相同也可能不同。一般而言删除一个结点,然后重新加入是从叶子结点处加入,所以肯定不是在原来的根位置。但是如果删除会失衡,则会调整,所以可能会调整回原来的位置。