凹入表形式打印树形结构C语言,树和二叉树-第6章-《数据结构题集》习题解析-严蔚敏吴伟民版...

习题集解析部分

第6章 树和二叉树

——《数据结构题集》-严蔚敏.吴伟民版

相关测试数据下载  链接☛

本习题文档的存放目录:数据结构▼配套习题解析▼06 树和二叉树

文档中源码的存放目录:数据结构▼配套习题解析▼06 树和二叉树▼习题测试文档-06

源码测试数据存放目录:数据结构▼配套习题解析▼06 树和二叉树▼习题测试文档-06Data

一、基础知识题

6.1❶已知一棵树的集合为{, , , , , , , , , , , ,

(1)哪个是根结点?

(2)哪些是叶子节点?

(3)哪个是结点G的双亲?

(4)哪些是结点G的祖先?

(5)哪些是结点G的孩子?

(6)哪些是结点E的子孙?

(7)哪些是结点E的兄弟?哪些是结点F的兄弟?

(8)结点B和N的层次号分别是什么?

(9)树的深度是多少?

(10)以结点C为根的子树的深度是多少?

f637c7e5a75d372fa8619c6b264418d2.png

6.2❶一棵度为2的树与一棵二叉树有何区别?

b400fc159c8df0ae4dc643974bd74819.png

6.3❶试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。

1859788aec9a8b0c3186fcbed173de7f.png

6.4❸一棵深度为H的满k叉树有如下性质:第H层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。如果按层次顺序从1开始对全部结点编号,问:

(1)各层的结点数目是多少?

(2)编号为p的结点的父结点(若存在)的编号是多少?

(3)编号为p的结点的第i个儿子结点(若存在)的编号是多少?

(4)编号为p的结点有右兄弟的条件是什么?其右兄弟的编号是多少?

a726c1a2fba7ce595a9b9746c6db3863.png

6.5❷已知一棵深度为k的树中有n1个度为1的结点,n2个度为2的结点,…,nk个度为k的结点,问该树中有多少个叶子结点?

441ce7b79748116524adac1e17da97de.png

6.6❸已知在一棵含有n个结点的树中,只有度为k的分支结点和度为0的叶子结点。试求该树含有的叶子结点的书目。

acb863dd45a0e98e1068ff28afe4afb6.png

a8d132e4bbcebb51f3ab2d305bc14c79.png

6.7❸ 一棵含有n个结点的k叉树,可能达到的最大深度和最小深度各为多少?

9c8e762dba8d52cfc21a220176f42013.png

6.8❹证明:一棵满k叉树上的叶子结点数n0和非叶子结点数n1之间满足以下关系:

n0=(k-1)n1+1。

8cc6664d70423cbb17a1a8e5d0bb12ce.png

6.9❷试分别推导含有n个结点和含n0个叶子结点的完全三叉树的深度H。

301c28f690a1fe3c0063218895863d28.png

6.10❹对于那些所有非叶子结点均有非空左右子树的二叉树:

(1)试问:有n个叶子结点的树中共有多少个结点?

(2)试证明:

dc203713ea460782d4f4283f1a6230d9.png,其中n为叶子结点的个数,li表示第i个叶子结点所在的层次(设根结点所在的层次为1)。

ff024345ab6c4eb0f1ea3741360d5148.png

6.11❸在二叉树的顺序存储结构中,实际上隐含着双亲的信息,因此可和三叉链表对应。假设每个指针域占4个字节的存储,每个信息域占k个字节的存储。试问:对于一棵有n个结点的二叉树,且在顺序存储结构中最后一个结点的下标为m,在什么条件下顺序存储结构比三叉链表更节省空间?

7402ccd12a282abfc2c0878a059ee264.png

6.12❷ 对题6.3所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列。

2d52f869fd2f3c4583ad4caa41c4d0be.png

6.13❷假设n和m为二叉树中两结点,用“1”、“0”或“Φ”(分别表示肯定、恰恰相反或者不一定)填写下标:

80128354218139ba5eef8709e0787b7b.png

注:如果(1)离a和b最近的共同祖先p存在,且(2)a在p的左子树中,b在p的右子树中,则称a在b的左方(即b在a的右方)。

6.14❷找出所有满足下列条件的二叉树:

(a)它们在先序遍历和中序遍历时,得到的结点访问序列相同;

(b)它们在后序遍历和中序遍历时,得到的结点访问序列相同;

(c)它们在先序遍历和后序遍历时,得到的结点访问序列相同。

77b368b17dd0e6519b416151b918fa33.png

6.15❷请对下图所示二叉树进行后序线索化,为每个空指针建立相应的前驱或后继线索。

f8f030ed7a0322376d6bb68a5ed4add7.png

0053300fa0c6023cdc504e67fefc2bce.png

6.16❷将下列二叉链表改为先序线索链表(不画出树的形态)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Info

A

B

C

D

E

F

G

H

I

J

K

L

M

N

Ltag

0

0

0

1

0

1

0

1

0

0

1

1

1

1

Lchild

2

4

6

2

7

3

10

14

12

13

13

9

10

11

Rtag

0

0

1

1

0

0

0

1

1

1

0

1

1

1

Rchild

3

5

6

5

8

9

11

3

12

13

14

0

11

8

fd070888ed7f9bb02992b828390c1710.png

6.17❸阅读下列算法,若有错,则改正之。

BiTree InSucc (BiTree q)

{  //已知q是指向中序线索二叉树上某个结点的指针。

//本函数返回指向*q的后继的指针。

r = q->rchild;

if(!r->rtag)

while(!r->rtag)

r = r->rchild;

return r;

}//InSucc

97c213a0325f2ba986f1d047280559db.png

6.18❺试讨论,能否在一棵中序全线索二叉树上查找给定结点*p在后序序列中的后继。

9bafaea4ed253e86ed07e134a30aaadb.png

6.19❷ 分别画出和下列树对应的各个二叉树:

94727b1d25b334e65f7f13536691d226.png

6.20❸将下列森林转换为相应的二叉树,并分别按以下说明进行线索化:

(1)先序前驱线索化;

(2)中序全线索化前驱线索和后继线索;

(3)后序后继线索化。

5b03062e49c5f624b5a24cfeff538cf2.png

6.21❷画出和下列二叉树相应的森林:

90f37173fb7fd37fc32a37ba530fca5f.png

6.22❷对于6.19题中给出的各树分别求出以下遍历序列:

(1)先根序列;

(2)后根序列。

7f5a2715fa28bf354dee455900602278.png

6.23❷画出和下列已知序列对应的树T: 树的先根次序访问序列为GFKDAIEBCHJ; 树的后根次序访问序列为DIAEKFCJHBG。

f2b0976bd171b45b92cef32b57ba80c1.png

6.24❸画出和下列已知序列对应的森林F: 森林的先序次序访问序列为:ABCDEFGHIJKL; 森林的中序次序访问序列为:CBEFDGAJIKLH。

8a888f5ca36e9f2218752803ae1667ed.png

f83d3ae8abbcd04bdf0af9432c2884d0.png

6.25❸证明:在结点数多于1的哈夫曼树中不存在度为1的结点。

9b300840738e3bf9dde94ce1326c0d35.png

6.26❸假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10。试为这8个字母设计哈夫曼编码。使用0~7的二进制表示形式是另一种编码方案。对于上述实例,比较两种方案的优缺点。

df9155c4f39a600c33cb9677ea2c6fb2.png

6.27❸假设一棵二叉树的先序序列为EBADCFHGIKJ和中序序列为ABCDEFGHIJK。请画出该树。

6.28❸假设一棵二叉树的中序序列为DCBGEAHFIJK和后序序列为DCEGBFHKJIA。请画出该树。

6.29❸假设一棵二叉树的层序序列为ABCDEFGHIJ和中序序列为DBGEHJACIF。请画出该树。

01a98b0131f84d774e96054f390de595.png

6.30❹证明:树中结点u是结点v的祖先,当且仅当在先序序列中u在v之前,且在后序序列中u在v之后。

ee5ee7c44ca6a2bd5848baa2d74ac372.png

aab93b3a38c774a373b95b8f097e1b00.png

6.31❹证明:由一棵二叉树的先序序列和中序序列可唯一确定这课二叉树。

ceb0c0b682128757d26f993fddfb2380.png

6.32❺证明:如果一棵二叉树的先序序列是u1,u2,…,un,中序序列是up1,up2,…,upn,则序列1,2,…,n可以通过一个栈得到序列p1,p2,…,pn;反之,若以上述中的结论作为前提,则存在一棵二叉树,若其前序序列是u1,u2,…,un,则其中序序列为up1,up2,…,upn。

f48dc7e052507c6a9f90b2d16738d579.png

二、算法设计题

二叉树顺序存储

6.33❸假定用两个一维数组L[n+1]和R[n+1]作为有n个结点的二叉树的存储结构,L[i]和r[i]分别指示结点i(i=1,2,…,n)的左孩子和右孩子,0表示空。试写一个算法判别结点u是否为结点v的子孙。

6.34❸同6.33题的条件。先由L和R建立一维数组T[n+1],使T中第i(i=1,2,…,n)个分量指示结点i的双亲,然后写判别结点u是否为结点v的子孙的算法。

700ae4572999f1a1e4c9973933ff2147.png

90d6ccd882716ae7b9f40231fe23f572.png

6.35❸假设二叉树中左分支的标号为“0”,右分支的标号为“1”,并对二叉树增设一个头结点,令根结点为其右孩子,则从头结点到树中任一结点所经分支的序列为一个二进制序列,可认作是某个十进制数的二进制表示。例如,右图所示二叉树中,和结点A对应的二进制序列为“110”,即十进制整数6的二进制表示。已知一棵非空二叉树以顺序存储结构表示,试写一尽可能简单的算法,求出与在树的顺序存储结构中下标值为i的结点对应的十进制整数。

290805c188c0700cbb880cf45cd281ea.png4543225ca96dcb5e32da904fb6939115.png

在以下6.36至6.38和6.41至6.53题中,均以二叉链表作为二叉树的存储结构。 二叉树的二叉链表

6.36❸若已知两棵二叉树B1和B2皆为空,或者皆不空且B1的左、右子树和B2的左、右子树分别相似,则称二叉树B1和B2相似。试编写算法,判别给定两棵二叉树是否相似。

0361d5641e68aed197081f4e8abd7619.png

f83427d38d26d63a6f6dbc423ed40942.png

6.37❸试利用栈的基本操作写出先序遍历的非递归形式的算法。

6.38❹同6.37题条件,写出后序遍历的非递归算法(提示:为分辨后序遍历时两次进栈的不同返回点,需在指针进栈时同时将一个标志进栈)。

c07547b7bdf34497c564765f1e161f20.png

33ea4f412617ff395c4bc92d6282ef6d.png

6.39❹假设在二叉链表的结点中增设两个域:双亲域(parent)以指示其双亲结点;标志域(mark取值0、1、2)以区分在遍历过程中到达该结点时应继续向左或向右或访问该结点。试以此存储结构编写不用栈进行后序遍历的递推形式的算法。

d36d62ceef38c58d5b1e719e807d14d4.png

97b4c12e47c0c403d3862325824b447e.png

360207280b7cd7b843d360068b07ade2.png

6.40❸若在二叉链表的结点中只增设一个双亲域以指示其双亲结点,则在遍历过程中能否不设栈?试以此存储结构编写不设栈进行中序遍历的递推形式的算法。

ebedd4f7cd4237c33c9796d27696371e.png

96e8d3d71ee36caa179711e5c8524a8e.png

6.41❸编写递归算法,在二叉树中求位于先序序列中第k个位置的结点的值。

6.42❸编写递归算法,计算二叉树中叶子结点的数目。

6.43❸编写递归算法,将二叉树中所有结点的左、右子树相互交换。

6.44❹编写递归算法:求二叉树中以元素值为x的结点为根的子树的深度。

6.46❸编写复制一棵二叉树的非递归算法。

6.47❹编写按层次顺序(同一层自左至右)遍历二叉树的算法。

6.48❺已知在二叉树中,*root为根结点,*p和*q为二叉树中两个结点,试编写求距离它们最近的共同祖先的算法。

6.49❹编写算法判别给定二叉树是否为完全二叉树。

ecf9eef6e05fbc6690acb831d757ef1d.png

d1c1726197a46bf9ae0187feaedaee9a.png

7d30aa685062676c68e356d945aa9f80.png

2bfa73dc162157c98323874be748990a.png

71c8fb77d1245228f9039f447b689831.png

e500f03d90fee289b7fc153eaeb45f22.png

b2741903aa6e4d1a631698483b07dbeb.png

6.50❺假设以三元组(F,C,L/R)的形式输入一棵二叉树的诸边(其中F表示双亲结点的标识,C表示孩子结点标识,L/R表示C为F的左孩子或右孩子),且在输入的三元组序列中,C是按层次顺序出现的。设结点的标识是字符类型。F=‘^’时C为根结点标识,若C也为‘^’,则表示输入结束。例如,6.15题所示的二叉树的三元组序列输入格式为:

afe103ea75424d997eff3c3bb4abd687.png

试编写算法,由输入的三元组序列建立二叉树的二叉链表。

5381c39c50adf8c862ec65e9ec034253.png

bfbbd7a4cffd6d094c7e7ff833b7c03f.png

6.51❺编写一个算法,输出以二叉树表示的算术表达式,若该表达式中含有括号,则在输出时应添上。

26557bb250e1aa42d3ba36332e7ed6b2.png

93e4d08490fd1873a225c7ce87d62ab8.png

6.52❹一棵二叉树的繁茂度定义为各层结点数的最大值与树的高度的乘积。试写一算法,求二叉树的繁茂度。

0dada8b72cbbd0444fde126cd6819a63.png

79fc122fc139190458ff21e9aff6996a.png

6.53❺试编写算法,求给定二叉树上从根结点到叶子结点的一条其路径长度等于树的深度减一的路径(即列出从根结点到该叶子结点的结点序列),若这样的路径存在多条,则输出路径终点(叶子结点)在“最左”的一条。

04195268b924727cbcf3adf3e388c319.png

859b2ccfd72c4b6ce531aebf951916f3.png

36d2b3d988d7c9686a9bab1edae43605.png

6.54❸假设以顺序表sa表示一棵完全二叉树,sa.elem[1..sa.last]中存放树中各结点的数据元素。试编写算法由此顺序存储结构建立该二叉树的二叉链表。

81630a2d33876c1329523ac710cf3538.png

c4ff7aa890802cc101d38d8ac4e37680.png

6.55❹为二叉链表的结点增加DescNum域。试编写一算法,求二叉树的每个结点的子孙数目并存入其DescNum域。请给出算法的时间复杂度。

0c5d37374e15443eb6b074296f59ef06.png

c017665b63081de520911d6963d0301d.png

线索二叉树

6.56❸试写一个算法,在先序后继线索二叉树中,查找给定结点*p在先序序列中的后继(假设二叉树的根结点未知)。并讨论实现此算法对存储结构有何要求?

6.57❸试写一个算法,在后序后继线索二叉树中,查找给定结点*p在后序序列中的后继(二叉树的根结点指针并未给出)。并讨论实现此算法对存储结构有何要求?

af4492e560f30f43cc3292940306f301.png779e27cfd21a581c872478f75c7eed1c.png

6.58❹试写一个算法,在中序全线索二叉树的结点*p之下,插入一棵以结点*x为根、只有左子树的中序全线索二叉树,使*x为根的二叉树称为*p的左子树。若*p原来有左子树,则令它为*x的右子树。完成插入之后的二叉树应保持全线索化特性。

4c66f2573d7dd243f20569db7be569f0.png

d3bf54b3a3208d78dfbd4b1296610a87.png

021a42e9b171a78a5f89af5a86764d41.png

孩子-兄弟链表

6.59❸编写算法完成下列操作:无重复地输出以孩子-兄弟链表存储的树T中所有的边。输出的形式为(k1, k2), …, (ki, kj), …,其中,ki和kj为树结点中的结点标识。

6.60❸试编写算法,对一棵以孩子-兄弟链表表示的树统计叶子的个数。

6.61❸试编写算法,求一棵以孩子-兄弟链表表示的树的度。

6.62❹对以孩子-兄弟链表表示的树编写计算树的深度的算法。

9cce7c31226402a832df8cedfe9b2822.png

dfcbd37ab2a6c13d18ffbe77a9fd8095.png

孩子链表

6.63❸对以孩子链表表示的树编写计算树的深度的算法。

ed2bb2de15da8e037e28eb6c615b8091.png

13e6d9378ef827f81834db36978ceddc.png

树的双亲表表示

6.64❹对以双亲表表示的树编写计算树的深度的算法。

6b0a3cc166adccb3e3042efc1132bda7.png

2f2f89b6e4bdd5581f16b8bb2c539414.png

二叉树的二叉链表

6.65❹已知一棵二叉树的前序序列和中序序列分别存于两个一维数组中,试编写算法建立该二叉树的二叉链表。

431df5ca5ecc174f1b552f0f1a42b67e.png

b0ba00d1fdef086effbf9fce21fc86b8.png

f98b18ff66c83f8846d3f8b7948fec6b.png

孩子-兄弟链表

6.66❹假设有n个结点的树T采用了双亲表示法,写出由此建立树的孩子-兄弟链表的算法。

30084ce6c7555ef501147e5f9709860e.png

c5cad6bb917972cb647dc55f2b72786a.png

6.67❹假设以二元组(F,C)的形式输入一棵树的诸边(其中F表示双亲结点的标识,C表示孩子结点标识),且在输入的二元组序列C中,C是按层次顺序出现的。F=‘^’时C为根结点标识,若C也为‘^’,则表示输入结束。例如,如下所示树的输入序列为:

eb2021056928cdac64af46665423f3fe.gif

试编写算法,由输入的二元组序列建立该树的孩子-兄弟链表。

ddacaa75257866fe24d24af41bc89769.png

c5e79b1d45d378b1362184e79ce1fd0e.png

6.68❸已知一棵树的由根至叶子结点按层次输入的结点序列及每个结点的度(每层中自左至右输入),试写出构造此树的孩子-兄弟链表的算法。

4bccf6748a32258651a42c720e45fb3f.png

cf7ed4a833d0ca704cd399cb12bd0bdb.png

二叉树的二叉链表

6.69❹假设以二叉链表存储的二叉树中,每个结点所含数据元素均为单字母,试编写算法,按树形状打印二叉树的算法。例如:左下二叉树印为右下形状。

deea76128cafa02e33be39fe3371d0d5.png

0858f0f69db33ebb045947112141fcae.gif

6.70❺如果用大写字母标识二叉树结点,则一棵二叉树可以用符合下面语法图的字符序列表示。试写一个递归算法,由这种形式的字符序列,建立相应的二叉树的二叉链表存储结构。

6c7b9876c781dbc1ea3de5c17f5a005a.gif

例如:6.39题所示的二叉树输入形式为A(B(#,D),C(E(#,F),#))。

d7add0d40f2a6b64b83d782523c73b88.gif

b49f0fce6ccabb8928433b3c9bd6ebd7.png

孩子-兄弟链表

6.71❺假设树上每个结点所含的数据元素为一个字母,并且以孩子-兄弟链表为树的存储结构,试写一个按凹入表方式打印一棵树的算法。例如:左下所示树印为右下形状。

71b61b02d4286a73be4946d32db779be.png

94a46498b9ec899bd642b2539ebd1ee8.png

孩子链表

6.72❺以孩子链表为树的存储结构,重做6.71题。 孩子-兄弟链表

a147a2efe87a3c42b67face40d642b7e.png

5b94440232309815fd2190eef42388ff.png

6.73❺若用大写字母标识树的结点,则可用带标号的广义表形式表示一棵树,其语法图如下所示:

f6645e6b043fda43c48d4f69b54b9d49.gif

例如,6.71题中的树可用下列形式的广义表表示:

A(B(E,F),C(G),D)

试写一递归算法,由这种广义表表示的字符序列构造树的孩子-兄弟链表(提示:按照森林和树相互递归的定义写两个互相递归调用的算法,语法图中一对圆括号内的部分可看成为森林的语法图)。

6.74❺试写一递归算法,以6.73题给定的树的广义表表示法的字符序列形式输出以孩子-兄弟链表表示的树。

305a49a2de62c0d4b991a3db63f2d32c.png

226fc8ef774bd2fdeb6a49ae1f946228.png

孩子链表

6.75❺试写以递归算法,由6.73题定义的广义表表示法的字符序列,构造树的孩子链表。

6.76❺试写以递归算法,以6.73题给定的树的广义表表示法的字符序列形式输出以孩子链表表示的树。

7459bd85bd17df11e0a38f1ecc9bc5d7.png

760cb1e5e7799ba4eeca198845e225b6.png

b79406348b39b9d971459c8fbcec0335.png

  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值