数据结构C语言版第五六章习题答案.docx
- 文档编号:7087295
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:21
- 大小:261.79KB
数据结构C语言版第五六章习题答案.docx
《数据结构C语言版第五六章习题答案.docx》由会员分享,可在线阅读,更多相关《数据结构C语言版第五六章习题答案.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构C语言版第五六章习题答案
第5章树和二叉树
1.选择题
(1)把一棵树转换为二叉树后,这棵二叉树的形态是()。
A.唯一的B.有多种
C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子
(2)由3个结点可以构造出多少种不同的二叉树?
()
A.2B.3C.4D.5
(3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。
A.250B.500C.254D.501
(4)一个具有1025个结点的二叉树的高h为()。
A.11B.10C.11至1025之间D.10至1024之间
(5)深度为h的满m叉树的第k层有()个结点。
(1= A.mk-1B.mk-1C.mh-1D.mh-1 (6)利用二叉链表存储树,则根结点的右指针是()。 A.指向最左孩子B.指向最右孩子C.空D.非空 (7)对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用()遍历实现编号。 A.先序B.中序C.后序D.从根开始按层次遍历 (8)若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用()遍历方法最合适。 A.前序B.中序C.后序D.按层次 (9)在下列存储形式中,()不是树的存储形式? A.双亲表示法B.孩子链表表示法C.孩子兄弟表示法D.顺序存储表示法 (10)一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()。 A.所有的结点均无左孩子B.所有的结点均无右孩子 C.只有一个叶子结点D.是任意一棵二叉树 (11)某二叉树的前序序列和后序序列正好相反,则该二叉树一定是()的二叉树。 A.空或只有一个结点B.任一结点无左子树 C.高度等于其结点数D.任一结点无右子树 (12)若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为()。 A.X的双亲B.X的右子树中最左的结点 C.X的左子树中最右结点D.X的左子树中最右叶结点 (13)引入二叉线索树的目的是()。 A.加快查找结点的前驱或后继的速度B.为了能在二叉树中方便的进行插入与删除 C.为了能方便的找到双亲D.使二叉树的遍历结果唯一 (14)线索二叉树是一种()结构。 A.逻辑B.逻辑和存储C.物理D.线性 (15)设F是一个森林,B是由F变换得的二叉树。 若F中有n个非终端结点,则B中右指针域为空的结点有()个。 A.n-1B.nC.n+1D.n+2 2.应用题 (1)试找出满足下列条件的二叉树 先序序列与后序序列相同 中序序列与后序序列相同 先序序列与中序序列相同 中序序列与层次遍历序列相同 先序遍历二叉树的顺序是“根—左子树—右子树”,中序遍历“左子树—根—右子树”,后序遍历顺序是: “左子树—右子树―根",根据以上原则,本题解答如下: (1) 若先序序列与后序序列相同,则或为空树,或为只有根结点的二叉树 (2) 若中序序列与后序序列相同,则或为空树,或为任一结点至多只有左子树的二叉树. (3) 若先序序列与中序序列相同,则或为空树,或为任一结点至多只有右子树的二叉树. (4) 若中序序列与层次遍历序列相同,则或为空树,或为任一结点至多只有右子树的二叉树 (2)设一棵二叉树的先序序列: ABDFCEGH,中序序列: BFDAGEHC 画出这棵二叉树。 画出这棵二叉树的后序线索树。 将这棵二叉树转换成对应的树(或森林)。 (1) (2) (3)假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。 试为这8个字母设计赫夫曼编码。 试设计另一种由二进制表示的等长编码方案。 对于上述实例,比较两种方案的优缺点。 解: 方案1;哈夫曼编码 先将概率放大100倍,以方便构造哈夫曼树。 w={7,19,2,6,32,3,21,10},按哈夫曼规则: 【[(2,3),6],(7,10)】,……19,21,32 (100) (40)(60) 192132(28) (17)(11) 7106(5) 23 方案比较: 方案1的WPL=2(0.19+0.32+0.21)+4(0.07+0.06+0.10)+5(0.02+0.03)=1.44+0.92+0.25=2.61 方案2的WPL=3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3 结论: 哈夫曼编码优于等长二进制编码 (4)已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。 初态: weight parent lchild rchild 1 3 0 0 0 2 12 0 0 0 3 7 0 0 0 4 4 0 0 0 5 2 0 0 0 6 8 0 0 0 7 11 0 0 0 8 0 0 0 9 0 0 0 10 0 0 0 11 0 0 0 12 0 0 0 13 0 0 0 weight parent lchild rchild 1 3 8 0 0 2 12 12 0 0 3 7 10 0 0 4 4 9 0 0 5 2 8 0 0 6 8 10 0 0 7 11 11 0 0 8 5 9 5 1 9 9 11 4 8 10 15 12 3 6 11 20 13 9 7 12 27 13 2 10 13 47 0 11 12 终态 3.算法设计题 以二叉链表作为二叉树的存储结构,编写以下算法: (1)统计二叉树的叶结点个数。 intLeafNodeCount(BiTreeT) { if(T==NULL) return0;//如果是空树,则叶子结点个数为0 elseif(T->lchild==NULL&&T->rchild==NULL) return1;//判断该结点是否是叶子结点(左孩子右孩子都为空),若是则返回1 else returnLeafNodeCount(T->lchild)+LeafNodeCount(T->rchild); } (2)判别两棵树是否相等。 (3)交换二叉树每个结点的左孩子和右孩子。 voidChangeLR(BiTree&T) { BiTreetemp; if(T->lchild==NULL&&T->rchild==NULL) return; else { temp=T->lchild; T->lchild=T->rchild; T->rchild=temp; } ChangeLR(T->lchild); ChangeLR(T->rchild); } (4)设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)。 voidDoubleTraverse(BiTreeT) { if(T==NULL) return; elseif(T->lchild==NULL&&T->rchild==NULL) cout< else { cout< DoubleTraverse(T->lchild); cout< DoubleTraverse(T->rchild); } } (5)计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。 [题目分析]求二叉树高度的算法见上题。 求最大宽度可采用层次遍历的方法,记下各层结点数,每层遍历完毕,若结点数大于原先最大宽度,则修改最大宽度。 intWidth(BiTreebt)//求二叉树bt的最大宽度 {if(bt==null)return(0);//空二叉树宽度为0 else {BiTreeQ[];//Q是队列,元素为二叉树结点指针,容量足够大 front=1;rear=1;last=1;//front队头指针,rear队尾指针,last同层最右结点在队列中的位置 temp=0;maxw=0;//temp记局部宽度,maxw记最大宽度 Q[rear]=bt;//根结点入队列 while(front<=last) {p=Q[front++];temp++;//同层元素数加1 if(p->lchild! =null)Q[++rear]=p->lchild;//左子女入队 if(p->rchild! =null)Q[++rear]=p->rchild;//右子女入队 if(front>last)//一层结束, {last=rear; if(temp>maxw)maxw=temp;//last指向下层最右元素,更新当前最大宽度 temp=0; }//if }//while return(maxw); }//结束width (6)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。 intLevel(BiTreebt)//层次遍历二叉树,并统计度为1的结点的个数 {intnum=0;//num统计度为1的结点的个数 if(bt){QueueInit(Q);QueueIn(Q,bt);//Q是以二叉树结点指针为元素的队列 while(! QueueEmpty(Q)) {p=QueueOut(Q);printf(p->data);//出队,访问结点 if(p->lchild&&! p->rchild||! p->lchild&&p->rchild)num++;//度为1的结点 if(p->lchild)QueueIn(Q,p->lchild);//非空左子女入队 if(p->rchild)QueueIn(Q,p->rchild);//非空右子女入队 }}//if(bt) return(num);}//返回度为1的结点的个数 (7)求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。 [题目分析]因为后序遍历栈中保留当前结点的祖先的信息,用一变量保存栈的最高栈顶指针,每当退栈时,栈顶指针高于保存最高栈顶指针的值时,则将该栈倒入辅助栈中,辅助栈始终保存最长路径长度上的结点,直至后序遍历完毕,则辅助栈中内容即为所求。 voidLongestPath(BiTreebt)//求二叉树中的第一条最长路径长度 {BiTreep=bt,l[],s[];//l,s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点 inti,top=0,tag[],longest=0; while(p||top>0) {while(p){s[++top]=p;tag[top]=0;p=p->Lc;}//沿左分枝向下 if(tag[top]==1)//当前结点的右分枝已遍历 {if(! s[top]->Lc&&! s[top]->Rc)//只有到叶子结点时,才查看路径长度 if(top>longest){for(i=1;i<=top;i++)l[i]=s[i];longest=top;top--;} //保留当前最长路径到l栈,记住最高栈顶指针,退栈 } elseif(top>0){tag[top]=1;p=s[top].Rc;}//沿右子分枝向下 }//while(p! =null||top>0) }//结束LongestPath (8)输出二叉树中从每个叶子结点到根结点的路径。 [题目分析]采用先序遍历的递归方法,当找到叶子结点*b时,由于*b叶子结点尚未添加到path中,因此在输出路径时还需输出b->data值。 对应的递归算法如下: voidAllPath(BTNode*b,ElemTypepath[],intpathlen) { inti; if(b! =NULL) { if(b->lchild==NULL&&b->rchild==NULL)//*b为叶子结点 { cout<<""< "< for(i=pathlen-1;i>=0;i--) cout< } else { path[pathlen]=b->data;//将当前结点放入路径中 pathlen++;//路径长度增1 AllPath(b->lchild,path,pathlen);//递归扫描左子树 AllPath(b->rchild,path,pathlen);//递归扫描右子树 pathlen--;//恢复环境 } } } 第6章图 1.选择题 (1)在一个图中,所有顶点的度数之和等于图的边数的()倍。 A.1/2B.1C.2D.4 (2)在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的()倍。 A.1/2B.1C.2D.4 (3)具有n个顶点的有向图最多有()条边。 A.nB.n(n-1)C.n(n+1)D.n2 (4)n个顶点的连通图用邻接距阵表示时,该距阵至少有()个非零元素。 A.nB.2(n-1)C.n/2D.n2 (5)G是一个非连通无向图,共有28条边,则该图至少有()个顶点。 A.7B.8C.9D.10 (6)若从无向图的任意一个顶点出发进行一次深度优先搜索可以访问图中所有的顶点,则该图一定是()图。 A.非连通B.连通C.强连通D.有向 (7)下面( )算法适合构造一个稠密图G的最小生成树。 A.Prim算法B.Kruskal算法C.Floyd算法D.Dijkstra算法 (8)用邻接表表示图进行广度优先遍历时,通常借助()来实现算法。 A.栈B.队列C.树D.图 (9)用邻接表表示图进行深度优先遍历时,通常借助()来实现算法。 A.栈B.队列C.树D.图 (10)深度优先遍历类似于二叉树的()。 A.先序遍历B.中序遍历C.后序遍历D.层次遍历 (11)广度优先遍历类似于二叉树的()。 A.先序遍历B.中序遍历C.后序遍历D.层次遍历 (12)图的BFS生成树的树高比DFS生成树的树高()。 A.小B.相等C.小或相等D.大或相等 A.0243156 B.0136542 C.0134256 D.0361542 (13)已知图的邻接矩阵如图6.25所示,则从顶点0出发按深度优先遍历的结果是()。 图6.25邻接矩阵 (14)已知图的邻接表如图6.26所示,则从顶点0出发按广度优先遍历的结果是(),按深度优先遍历的结果是()。 A.0132B.0231 C.0321D.0123 图6.26邻接表 (15)下面()方法可以判断出一个有向图是否有环。 A.深度优先遍历B.拓扑排序C.求最短路径D.求关键路径 2.应用题 (1)已知如图6.27所示的有向图,请给出: 每个顶点的入度和出度; 邻接矩阵; 邻接表; 逆邻接表。 图6.27有向图 (2)已知如图6.28所示的无向网,请给出: 邻接矩阵; 邻接表; 最小生成树 图6.28无向网 a → b 4 → c 3 b → a 4 → c 5 → d 5 → e 9 ^ c → a 3 → b 5 → d 5 → h 5 ^ d → b 5 → c 5 → e 7 → f 6 → g 5 → h 4^ e → b 9 → d 7 → f 3 ^ f → d 6 → e 3 → g 2 ^ g → d 5 → f 2 → h 6 ^ h → c 5 → d 4 → g 6 ^ (3)已知图的邻接矩阵如6.29所示。 试分别画出自顶点1出发进行遍历所得的深度优先生成树和广度优先生成树。 图6.29邻接矩阵 (4)有向网如图6.30所示,试用迪杰斯特拉算法求出从顶点a到其他各顶点间的最短路径,完成表6.9。 图6.30有向网 D 终点 i=1 i=2 i=3 i=4 i=5 i=6 b 15 (a,b) 15 (a,b) 15 (a,b) 15 (a,b) 15 (a,b) 15 (a,b) c 2 (a,c) d 12 (a,d) 12 (a,d) 11 (a,c,f,d) 11 (a,c,f,d) e ∞ 10 (a,c,e) 10 (a,c,e) f ∞ 6 (a,c,f) g ∞ ∞ 16 (a,c,f,g) 16 (a,c,f,g) 14 (a,c,f,d,g) S 终点集 {a,c} {a,c,f} {a,c,f,e} {a,c,f,e,d} {a,c,f,e,d,g} {a,c,f,e,d,g,b} (5)试对图6.31所示的AOE-网: 求这个工程最早可能在什么时间结束; 求每个活动的最早开始时间和最迟开始时间; 图6.31AOE-网 确定哪些活动是关键活动 【解答】按拓扑有序的顺序计算各个顶点的最早可能开始时间Ve和最迟允许开始时间Vl。 然后再计算各个活动的最早可能开始时间e和最迟允许开始时间l,根据l-e=0? 来确定关键活动,从而确定关键路径。 1 2 3 4 5 6 Ve 0 19 15 29 38 43 Vl 0 19 15 37 38 43 <1,2> <1,3> <3,2> <2,4> <2,5> <3,5> <4,6> <5,6> e 0 0 15 19 19 15 29 38 l 17 0 15 27 19 27 37 38 l-e 17 0 0 8 0 12 8 0 此工程最早完成时间为43。 关键路径为<1,3><3,2><2,5><5,6> 3.算法设计题 (1)分别以邻接矩阵和邻接表作为存储结构,实现以下图的基本操作: 增添一个新顶点v,InsertVex(G,v); 删除顶点v及其相关的边,DeleteVex(G,v); 增加一条边 删除一条边 //本题中的图G均为有向无权图,其余情况容易由此写出 StatusInsert_Vex(MGraph&G,charv)//在邻接矩阵表示的图G上插入顶点v { if(G.vexnum+1)>MAX_VERTEX_NUMreturnINFEASIBLE; G.vexs[++G.vexnum]=v; returnOK; }//Insert_Vex StatusInsert_Arc(MGraph&G,charv,charw)//在邻接矩阵表示的图G上插入边(v,w) { if((i=LocateVex(G,v))<0)returnERROR; if((j=LocateVex(G,w))<0)returnERROR; if(i==j)returnERROR; if(! G.arcs[j].adj) { G.arcs[j].adj=1; G.arcnum++; } returnOK; }//Insert_Arc StatusDelete_Vex(MGraph&G,charv)//在邻接矩阵表示的图G上删除顶点v { n=G.vexnum; if((m=LocateVex(G,v))<0)returnERROR; G.vexs[m]<->G.vexs[n];//将待删除顶点交换到最后一个顶点 for(i=0;i { G.arcs[m]=G.arcs[n]; G.arcs[m]=G.arcs[n];//将边的关系随之交换 } G.arcs[m][m].adj=0; G.vexnum--; returnOK; }//Delete_Vex 分析: 如果不把待删除顶点交换到最后一个顶点的话,算法将会比较复杂,而伴随着大量元素的移动,时间复杂度也会大大增加. StatusDelete_Arc(MGraph&G,charv,charw)//在邻接矩阵表示的图G上删除边(v,w) { if((i=LocateVex(G,v))<0)returnERROR; if((j=LocateVex(G,w))<0)returnERROR; if(G.arcs[j].adj) { G.arcs[j].adj=0; G.arcnum--; } returnOK; }/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 第五 习题 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)