第6章 树和二叉树
一、选择题
1.D |
2.B |
3.C |
4.D |
5.D |
6.A |
7.1C |
7.2A |
7.3C |
7.4A |
7.5C |
8.B |
9.C |
10.D |
11.B |
12.E |
13.D |
14.D |
15.C |
16.B |
17.C |
18.C |
19.B |
20.D |
21.A |
22.A |
23.C |
24.C |
25.C |
26.C |
27.C |
28.C |
29.B |
30.C |
31.D |
32.B |
33.A |
34.D |
35.B |
36.B |
37.C |
38.B |
39.B |
40.B |
41.1F |
41.2B |
42.C |
43.B |
44.C |
45.C |
46.B |
47.D |
48.B |
49.C |
50.A |
51.C |
52.C |
53.C |
54.D |
55.C |
56.B |
57.A |
58.D |
59.D |
60.B |
61.1B |
61.2A |
61.3G |
62.B |
63.B |
64.D |
65.D |
66.1C |
66.2D |
66.3F |
66.4H |
66.5I |
|
|
|
|
|
|
|
部分答案解释如下。
12. 由二叉树结点的公式:n=n0+n1+n2=n0+n1+(n0-1)=2n0+n1-1, 因为n=1001,所以1002=2n0+n1,在完全二叉树树中,n1只能取0或1,在本题中只能取0,故n=501,因此选E。
42.前序序列是“根左右”,后序序列是“左右根”,若要这两个序列相反,只有单支树,所以本题的A和B均对,单支树的特点是只有一个叶子结点,故C是最合适的,选C。A或B都不全。由本题可解答44题。
47. 左子树为空的二叉树的根结点的左线索为空(无前驱),先序序列的最后结点的右线索为空(无后继),共2个空链域。
52.线索二叉树是利用二叉树的空链域加上线索,n个结点的二叉树有n+1个空链域。
二、判断题
1.× |
2.× |
3.× |
4. √ |
5. √ |
6. √ |
7.√ |
8.× |
9. √ |
10.× |
11.× |
12.× |
13.× |
14.√ |
15.× |
16.× |
17.√ |
18.√ |
19.× |
20.√ |
21.× |
22.√ |
23.× |
24.× |
25.√ |
26.× |
27.× |
28.× |
29.√ |
30.× |
31.× |
32.√ |
33.× |
34.× |
35.× |
36.√ |
37.√ |
38.× |
39.× |
40.× |
41.(3) |
42.√ |
43.√ |
44.× |
45.√ |
46.× |
47.× |
48.× |
49.√ |
50.√ |
|
|
|
|
|
|
|
|
|
|
部分答案解释如下。
6.只有在确定何序(前序、中序、后序或层次)遍历后,遍历结果才唯一。
19.任何结点至多只有左子树的二叉树的遍历就不需要栈。
24. 只对完全二叉树适用,编号为i的结点的左儿子的编号为2i(2i<=n),右儿子是2i+1(2i+1<=n)
37. 其中序前驱是其左子树上按中序遍历的最右边的结点(叶子或无右子女),该结点无右孩子。
38 . 新插入的结点都是叶子结点。
42. 在二叉树上,对有左右子女的结点,其中序前驱是其左子树上按中序遍历的最右边的结点(该结点的后继指针指向祖先),中序后继是其右子树上按中序遍历的最左边的结点(该结点的前驱指针指向祖先)。
44.非空二叉树中序遍历第一个结点无前驱,最后一个结点无后继,这两个结点的前驱线索和后继线索为空指针。
三.填空题
1.(1)根结点(2)左子树(3)右子树 2.(1)双亲链表表示法(2)孩子链表表示法(3)孩子兄弟表示法
3.p->lchild==null && p->rchlid==null 4.(1) ++a*b3*4-cd (2)18 5.平衡因子
6. 9 7. 12 8.(1)2k-1 (2)2k-1 9.(1)2H-1 (2)2H-1 (3)H=ëlog2Nû+1
10. 用顺序存储二叉树时,要按完全二叉树的形式存储,非完全二叉树存储时,要加“虚结点”。设编号为i和j的结点在顺序存储中的下标为s 和t ,则结点i和j在同一层上的条件是ëlog2sû=ëlog2tû。
11. ëlog2iû=ëlog2jû 12.(1)0 (2)(n-1)/2 (3)(n+1)/2 (4) ëlog2nû +1 13.n
14. N2+1 15.(1) 2K+1-1 (2) k+1 16. ëN/2û 17. 2k-2 18. 64
19. 99 20. 11 21.(1) n1-1 (2)n2+n3
22.(1)2k-2+1(第k层1个结点,总结点个数是2H-1,其双亲是2H-1/2=2k-2)(2) ëlog2iû+1 23.69
24. 4 25.3h-1 26. ën/2û 27. élog2kù+1
28.(1)完全二叉树 (2)单枝树,树中任一结点(除最后一个结点是叶子外),只有左子女或只有右子女。
29.N+1 30.(1) 128(第七层满,加第八层1个) (2) 7
31. 0至多个。任意二叉树,度为1的结点个数没限制。只有完全二叉树,度为1的结点个数才至多为1。
32.21 33.(1)2 (2) n-1 (3) 1 (4) n (5) 1 (6) n-1
34.(1) FEGHDCB (2)BEF(该二叉树转换成森林,含三棵树,其第一棵树的先根次序是BEF)
35.(1)先序(2)中序 36. (1)EACBDGF (2)2 37.任何结点至多只有右子女的二叉树。
38.(1)a (2) dbe (3) hfcg 39.(1) .D.G.B.A.E.H.C.F. (2) ...GD.B...HE..FCA
40.DGEBFCA 41.(1)5 (2)略 42.二叉排序树 43.二叉树 44.前序
45.(1)先根次序(2)中根次序 46.双亲的右子树中最左下的叶子结点 47.2 48.(n+1)/2
49.31(x的后继是经x的双亲y的右子树中最左下的叶结点) 50.(1)前驱 (2)后继
51.(1)1 (2)y^.lchild (3)0 (4)x (5)1 (6) y (7)x(编者注:本题按中序线索化)
52.带权路径长度最小的二叉树,又称最优二叉树 53.69 54.(1)6 (2)261
55.(1)80 (2)001(不唯一)56.2n0-1
57.本题①是表达式求值,②是在二叉排序树中删除值为x的结点。首先查找x,若没有x,则结束。否则分成四种情况讨论:x结点有左右子树;只有左子树;只有右子树和本身是叶子。
(1)Postoder_eval(t^.Lchild) (2) Postorder_eval(t^.Rchild) (3)ERROR(无此运算符)(4)A
(5)tempA^.Lchild (6)tempA=NULL (7)q^.Rchild (8)q (9)tempA^.Rchild (10)tempA^.Item<r^.Item
58.(1) IF t=NIL THEN num:=0 ELSE num:=num(t^.l)+num(t^.r)+1
(2) IF (t=NIL) AND (m≤n) OR (t<>NIL) AND (m>n) THEN all:=false
ELSE BEGIN chk(t^.l,2*m);chk (t^.r,2*m+1);END
59. (1)p->rchild (2)p->lchild (3)p->lchild (4)ADDQ(Q,p->lchild) (5)ADDQ(Q,p->rchild)
60.(1)t->rchild!=null (2)t->rchild!=null (3)N0++ (4)count(t->lchild) (5)count(t->rchild)
61.(1)p (2)0 (3)height(p->lchild) (4)0 (5)height(p->rchild) (6)lh+1 (7)rh+1 (8)0
62.(1)p<>NIL (2)addx(p) (3)addx(tree) (4)r^.rchild
63.(1)stack[tp]=t (2) p=stack[tp--] (3)p (4)++tp
64.① 本算法将二叉树的左右子树交换
② (1)new (s) //初始化,申请结点 (2) s^.next=NIL //s是带头结点的链栈
(3)s^.next^.data //取栈顶元素 (4)s^.next:= p^.next //栈顶指针下移
(5)dispose(p) //回收空间 (6)p^.next:=s^.next //将新结点入链栈
(7)push(s,p^.rchild) //先沿树的左分支向下,将p的右子女入栈保存
(8)NOT empty(s) (9) finishe:=true //已完成 (10)finish=true (或s^.next=NIL)
65.(1)new(t) (2)2*i≤n (3)t^.lchild,2*i (4)2*i+1≤n (5)t^.rchild,2*i+1 (6)1
66.(1)Push(s,p) (2)K=2 (3)p->data=ch (4)BT=p (5) ins>>ch
67.(1)result; (2)p:=p^.link; (3) q:=q^.pre ((2)(3)顺序可变)
68.(1)top++ (2) stack[top]=p->rchild (3)top++ (4)stack[top]=p->lchild
69.(1)(i<=j) AND (x<=y) (2)A[i]<>B[k] (3)k-x
(4)creatBT(i+1,i+L,x,k-1,s^.lchild) (5) creatBT(i+L+1,j,k+1,y,s^.rchild)
70. (1)push(s,bt) (2)pop(s) (3)push(s,p^.rchild) // p的右子树进栈
71.(1) p=p->lchild // 沿左子树向下 (2)p=p->rchild
72.(1)0 (2)hl>hr (3)hr=hl
73. (1)top>0 (2)t*2 // 沿左分枝向下 (3)top-1 // 退栈
74.(1)p:=p^.lchild (2)(3)p:=S.data[s.top]^.rchild (4)s.top=0
75. (1)*ppos // 根结点 (2)rpos=ipos (3)rpos–ipos (4)ipos (5)ppos+1
76. (1)top>0 (2)stack[top]:=nd^.right (3)nd^.left<>NIL (4)top:=top+1 (左子树非空)
77. (1) p<>thr // 未循环结束 (2)p->ltag=0 (3)p->lchild
(4)p->rtag=1 && p->rchild!=thr (5) p=p->rchild (6)p=p->rchild
78. 若p^.rtag=1,则p^.rchild 为后继,否则p的后继是p的右子树中最左下的结点
(1)q=p^.rchild (2)q^.ltag=0 (3) q^.lchild
79.(1)tree->lchild (2)null (3)pre->rchild
(4)pre->rtag=1 (5) pre->right=tree; (6) tree->right (注(4)和(5)顺序可换)
80.(1)node->rflag==0 (2)*x=bt (3) *x=node->right
四.应用题
1.树的孩子兄弟链表表示法和二叉树二叉链表表示法,本质是一样的,只是解释不同,也就是说树(树是森林的特例,即森林中只有一棵树的特殊情况)可用二叉树唯一表示,并可使用二叉树的一些算法去解决树和森林中的问题。
树和二叉树的区别有三:一是二叉树的度至多为2,树无此限制;二是二叉树有左右子树之分,即使在只有一个分枝的情况下, 也必须指出是左子树还是右子树,树无此限制;三是二叉树允许为空,树一般不允许为空(个别书上允许为空)。
2.树和二叉树逻辑上都是树形结构,区别有以上题1所述三点。二叉树不是树的特例。
3.线性表属于约束最强的线性结构,在非空线性表中,只有一个“第一个”元素,也只有一个“最后一个”元素;除第一个元素外,每个元素有唯一前驱;除最后一个元素外,每个元素有唯一后继。树是一种层次结构,有且只有一个根结点,每个结点可以有多个子女,但只有一个双亲(根无双亲),从这个意义上说存在一(双亲)对多(子女)的关系。广义表中的元素既可以是原子,也可以是子表,子表可以为它表共享。从表中套表意义上说,广义表也是层次结构。从逻辑上讲,树和广义表均属非线性结构。但在以下意义上,又蜕变为线性结构。如度为1的树,以及广义表中的元素都是原
子时。另外,广义表从元素之间的关系可看成前驱和后继,也符
合线性表,但这时元素有原子,也有子表,即元素并不属于同一
数据对象。
4.方法有二。一是对该算术表达式(二叉树)进行后序遍历,
得到表达式的后序遍历序列,再按后缀表达式求值;二是递归
求出左子树表达式的值,再递归求出右子树表达式的值,最后
按根结点运算符(+、-、*、/ 等)进行最后求值。
5.该算术表达式转化的二叉树如右图所示。 第5题图
6.n(n>0)个结点的d度树共有nd个链域,除根结点外,每个结点均有一个指针所指,故该树的空链域有nd-(n-1)=n(d-1)+1个。
7.证明:设二叉树度为0和2的结点数及总的结点数分别为n0,n2 和n,则n=n0+n2 … (1)
再设二叉树的分支数为B, 除根结点外,每个结点都有一个分支所指,则 n=B+1… … …(2)
度为零的结点是叶子,没有分支,而度为2的结点有两个分支,因此(2)式可写为
n=2*n2+1 ……………(3)
由(1)、(3)得n2=n0-1,代入(1),并由(1)和(2)得B=2*(n0-1)。 证毕。
8.(1)kh-1(h为层数)
(2)因为该树每层上均有Kh-1个结点,从根开始编号为1,则结点i的从右向左数第2个孩子的结点编号为ki。设n 为结点i的子女,则关系式(i-1)k+2<=n<=ik+1成立,因i是整数,故结点n的双亲i的编号为ën-2)/kû+1。
(3) 结点n(n>1)的前一结点编号为n-1(其最右边子女编号是(n-1)*k+1),故结点 n的第 i个孩子的编号是(n-1)*k+1+i。
(4) 根据以上分析,结点n有右兄弟的条件是,它不是双亲的从右数的第一子女,即 (n-1)%k!=0,其右兄弟编号是n+1。
9.最低高度二叉树的特点是,除最下层结点个数不满外,其余各层的结点数都应达到各层的最大值。设n个结点的二叉树的最低高度是h,则n应满足2h-1<n<=2h-1关系式。解此不等式,并考虑h是整数,则有h=ëlognû+1,即任一结点个数为n 的二叉树的高度至少为O(logn)。
10.2n-1(本题等价于高度为n的满二叉树有多少叶子结点,从根结点到各叶子结点的单枝树是不同的二叉树。)
11.235。由于本题求二叉树的结点数最多是多少,第7层共有27-1=64个结点,已知有10个叶子,其余54个结点均为分支结点。它在第八层上有108个叶子结点。所以该二叉树的结点数最多可达(27-1+108)=235。(注意;本题并未明说完全二叉树的高度,但根据题意,只能8层。)
12.1023(=210-1)
13.证明:设度为1和2 的结点数是n1和n2,则二叉树结点数n为n=m+n1+n2………… (1)
由于二叉树根结点没有分枝所指,度为1和2的结点各有1个和2个分枝,度为0 的结点没有分枝,故二叉树的结点数n与分枝数B有如下关系
n=B+1=n1+2*n2+1……………………….(2)
由(1)和(2),得n2=m-1。即n个结点的二叉树,若叶子结点数是m,则非叶子结点中有(m-1)个度为2,其余度为1。
14.根据顺序存储的完全二叉树的性质,编号为i的结点的双亲的编号是ëi/2û,故A[i]和A[j]的最近公共祖先可如下求出:
while(i/2!=j/2)
if(i>j) i=i/2; else j=j/2;
退出while后,若i/2=0,则最近公共祖先为根结点,否则最近公共祖先是i/2。
15.N个结点的K叉树,最大高度N(只有一个叶结点的任意k叉树)。设最小高度为H,第i(1<=i<=H)层的结点数Ki-1,则N=1+k+k2+…+ kH-1,由此得H=ëlogK(N(K-1)+1)û
16. 结点个数在20到40的满二叉树且结点数是素数的数是31,其叶子数是16。
17.设分枝结点和叶子结点数分别是为nk和n0,因此有n=n0+nk (1)
另外从树的分枝数B与结点的关系有 n=B+1=K*nk +1 (2)
由(1)和(2)有 n0=n-nk=(n(K-1)+1)/K
18.用顺序存储结构存储n个结点的完全二叉树。编号为i的结点,其双亲编号是ëi/2û(i=1时无双亲),其左子女是2i(若2i<=n,否则i无左子女),右子女是2i+1(若2i+1<=n,否则无右子女)。
19. 根据完全二叉树的性质,最后一个结点(编号为n)的双亲结点的编号是ën/2û,这是最后一个分枝结点,在它之后是第一个终端(叶子)结点,故序号最小的叶子结点的下标是ën/2û+1。
20. 按前序遍历对顶点编号,即根结点从1开始,对前序遍历序列的结点从小到大编号。
21. 设树的结点数为n,分枝数为B,则下面二式成立
n=n0+n1+n2+…+nm (1)
n=B+1= n1+2n2+…+mnm (2)
由(1)和(2)得叶子结点数n0=1+
22. élog2nù +1 23.15
24. 该结论不成立。对于任一a€A,可在B中找到最近祖先f。a在f的左子树上。对于从f到根结点路径上所有b€B,有可能f在b的右子树上,因而a也就在b的右子树上,这时a>b,因此a<b不成立。同理可以证明b<c不成立。而对于任何a∈A,c∈C均有a<c。
25. n个结点的m次树,共有n*m个指针。除根结点外,其余n-1个结点均有指针所指,故空指针数为n*m-(n-1)=n*(m-1)+1。证毕。
26. 证明 设度为1和2 及叶子结点数分别为n0,n1和n2,则二叉树结点数n为n=n0+n1+n2 (1)
再看二叉树的分支数,除根结点外,其余结点都有一个分支进入,设B为分支总数,则n=B+1。度为1和2的结点各有1个和2个分支,度为0 的结点没有分支,故n=n1+2n2+1 (2)
由(1)和(2),得n0= n2+1。
27. 参见题26.
28. 设完全二叉树中叶子结点数为n,则根据完全二叉树的性质,度为2的结点数是n-1,而完全二叉树中,度为1的结点数至多为1,所以具有n个叶子结点的完全二叉树结点数是n+(n-1)+1=2n或2n-1(有或无度为1的结点)。由于具有2n(或2n-1)个结点的完全二叉树的深度是ëlog2(2n)û+1( ëlog2(2n-1)û+1,即élog2nù+1,故n个叶结点的非满的完全二叉树的高度是élog2nù+1。(最下层结点数>=2)。
29. (1)根据二叉树度为2 结点个数等于叶子结点个数减1的性质,故具有n个叶子结点且非叶子结点均有左左子树的二叉树的结点数是2n-1。
(2)证明:当i=1时,2-(1-1)=20=1,公式成立。设当i=n-1时公式成立,证明当i=n时公式仍成立。
设某叶子结点的层号为t,当将该结点变为内部结点,从而再增加两个叶子结点时,这两个叶子结点的层号都是t+1,对于公式的变化,是减少了一个原来的叶子结点,增加了两个新叶子结点,反映到公式中,因为2-(t-1)=2-(t+1-1)+2-(t+1-1),所以结果不变,这就证明当i=n时公式仍成立。证毕.
30.结点数的最大值2h-1(满二叉树),最小值2h-1(第一层根结点,其余每层均两个结点)。
31.(1)k(u-1)+1+i (2) ë(v-2)/kû+1 (参见第8题推导)
32.该二叉树是按前序遍历顺序编号,以根结点为编号1,前序遍历的顺序是“根左右”。
33.(1)设n=1,则e=0+2*1=2(只有一个根结点时,有两个外部结点),公式成立。
设有n个结点时,公式成立,即
En=In+2n (1)
现在要证明,当有n+1个结点时公式成立。
增加一个内部结点,设路径长度为l,则
In+1=In+l (2)
该内部结点,其实是从一个外部结点变来的,即这时相当于也增加了一个外部结点(原外部结点变成内部结点时,增加两个外部结点),则
En+1=En+l+2 (3)
由(1)和(2),则(3)推导为
En+1=In+2n+l+2=In+1-l+2n+l+2
=In+1+2(n+1)
故命题成立
(2)成功查找的平均比较次数s=I/n
不成功查找的平均比较次数u=(E-n)/(n+1)=(I+n)/n+1
由以上二式,有s=(1+1/n)*u-1 。
34.
该有向图只有一个顶点入度为0,其余顶点入度均为1,
它不是有向树。 35.题图
36.参见26题
37.由于二叉树前序遍历序列和中序遍历序列可唯一确定一棵二叉树,因此,若入栈序列为1,2,3,…,n,相当于前序遍历序列是1,2,3,…,n,出栈序列就是该前序遍历对应的二叉树的中序序列的数目。因为中序遍历的实质就是一个结点进栈和出栈的过程,二叉树的形态确定了结点进栈和出栈的顺序,也就确定了结点的中序序列。
下图以入栈序列1,2,3,(解释为二叉树的前序序列)为例,说明不同形态的二叉树在中序遍历时栈的状态和访问结点次序的关系:
|
|
|
|
|
|||
栈状态 访问 空 1 1 2 1 2 3 1 2 3 1 2 空 1 |
栈状态 访问 空 1 1 2 1 2 1 3 1 3 空 1 |
栈状态 访问 空 1 1 2 1 2 空 1 3 空 3 |
栈状态 访问 空 1 空 1 2 2 3 2 3 空 2 |
栈状态 访问 空 1 空 1 2 空 2 3 空 3 |
38.给定二叉树结点的前序序列和对称序(中序)序列,可以唯一确定该二叉树。因为前序序列的第一个元素是根结点,该元素将二叉树中序序列分成两部分,左边(设l个元素)表示左子树,若左边无元素,则说明左子树为空;右边(设r个元素)是右子树,若为空,则右子树为空。根据前序遍历中“根—左子树—右子树”的顺序,则由从第二元素开始的l个结点序列和中序序列根左边的l个结点序列构造左子树,由前序序列最后r个元素序列与中序序列根右边的r个元素序列构造右子树。
由二叉树的前序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分。例如,任何结点只有左子树的二叉树和任何结点只有右子树的二叉树,其前序序列相同,后序序列相同,但却是两棵不同的二叉树。
39.前序遍历是“根左右”,中序遍历是“左根右”,后序遍历是“左右根”。三种遍历中只是访问“根”结点的时机不同,对左右子树均是按左右顺序来遍历的,因此所有叶子都按相同的相对位置出现。
40.在第38题,已经说明由二叉树的前序序列和中序序列可以确定一棵二叉树,现在来证明由二叉树的中序序列和后序序列,也可以唯一确定一棵二叉树。
当n=1时,只有一个根结点,由中序序列和后序序列可以确定这棵二叉树。
设当n=m-1时结论成立,现证明当n=m时结论成立。
设中序序列为S1,S2,…,Sm,后序序列是P1,P2,…,Pm。因后序序列最后一个元素Pm是根,则在中序序列中可找到与Pm相等的结点(设二叉树中各结点互不相同)Si(1≤i≤m),因中序序列是由中序遍历而得,所以Si是根结点,S1,S2,…,Si-1是左子树的中序序列,而Si+1,Si+2,…,Sm是右子树的中序序列。
若i=1,则S1是根,这时二叉树的左子树为空,右子树的结点数是m-1,则{S2,S3,…,Sm}和{P1,P2,…,Pm-1}可以唯一确定右子树,从而也确定了二叉树。
若i=m,则Sm是根,这时二叉树的右子树为空,左子树的结点数是m-1,则{S1,S2,…,Sm-1}和{P1,P2,…,Pm-1}唯一确定左子树,从而也确定了二叉树。