树和二叉树-第6章-《数据结构题集》习题解析-严蔚敏吴伟民版

发布于 2019-09-26 作者 风铃 30次 浏览 版块 前端

第6章 树和二叉树


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


       源码使用说明  链接☛☛☛ 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明


       课本源码合辑  链接☛☛☛ 《数据结构》课本源码合辑


       习题集全解析  链接☛ 《数据结构题集》习题解析合辑


 


      相关测试数据下载  链接☛ 数据包


 


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


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


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


 


一、基础知识题


6.1❶已知一棵树的集合为{<I, M>, <I, N>, <E, I>, <B, E>, <B, D>, <A, B>, <G, J>, <G, K>, <C, G>, <C, F>, <H, L>, <C, H>, <A, C>},请画出这棵树,并回答下列问题:


(1)哪个是根结点?


(2)哪些是叶子节点?


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


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


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


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


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


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


(9)树的深度是多少?


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



 


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



 


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



 


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


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


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


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


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



 


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


 


 


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



 


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



 


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


n0=(k-1)n1+1。



 


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



 


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


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


(2)试证明:,其中n为叶子结点的个数,li表示第i个叶子结点所在的层次(设根结点所在的层次为1)。



 


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



 


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



 


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



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


 


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


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


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


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



 


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


 



 



 


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




 



 


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


BiTree InSucc (BiTree q)


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


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


  r = q->rchild;


  if(!r->rtag)


  while(!r->rtag)


    r = r->rchild;


  return r;


}//InSucc



 


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



 


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



 


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


(1)先序前驱线索化;


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


(3)后序后继线索化。



 


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



 


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


(1)先根序列;


(2)后根序列。



 


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



 


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



 


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



 


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



 


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


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


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



 


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



 


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



 


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



 


二、算法设计题


二叉树顺序存储


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的子孙的算法。



 


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


 


 


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


 


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



 


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


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



 


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



 


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



 


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


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


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


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


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


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


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


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



 


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


 


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



 


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



 


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



 


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



 


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



 


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



 


线索二叉树


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


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


 


 


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



 


孩子-兄弟链表


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


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


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


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



 


孩子链表


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



 


树的双亲表表示


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



 


二叉树的二叉链表


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



 


孩子-兄弟链表


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



 


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



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



 


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



 


二叉树的二叉链表


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



 


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



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



 


孩子-兄弟链表


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



 


孩子链表


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



 


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



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


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


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


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



 


孩子链表


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


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


收藏
暂无回复