数据结构第六章一二次作业
数据结构课后习题答案及解析第六章

第六章树和二叉树(下载后用阅读版式视图或web版式可以看清)习题一、选择题1.有一“遗传”关系:设x是y的父亲,则x可以把它的属性遗传给y。
表示该遗传关系最适合的数据结构为( )。
A.向量B.树 C图 D.二叉树2.树最合适用来表示( )。
A.有序数据元素B元素之间具有分支层次关系的数据C无序数据元素 D.元素之间无联系的数据3.树B的层号表示为la,2b,3d,3e,2c,对应于下面选择的( )。
A. la (2b (3d,3e),2c)B. a(b(D,e),c)C. a(b(d,e),c)D. a(b,d(e),c)4.高度为h的完全二叉树至少有( )个结点,至多有( )个结点。
A. 2h_lB.h C.2h-1 D. 2h5.在一棵完全二叉树中,若编号为f的结点存在右孩子,则右子结点的编号为( )。
A. 2iB. 2i-lC. 2i+lD. 2i+26.一棵二叉树的广义表表示为a(b(c),d(e(,g(h)),f)),则该二叉树的高度为 ( )。
A.3B.4C.5D.67.深度为5的二叉树至多有( )个结点。
A. 31B. 32C. 16D. 108.假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结点数为( )个。
A. 15B. 16C. 17D. 479.题图6-1中,( )是完全二叉树,( )是满二叉树。
..专业知识编辑整理..10.在题图6-2所示的二叉树中:(1)A结点是A.叶结点B根结点但不是分支结点 C根结点也是分支结点 D.分支结点但不是根结点(2)J结点是A.叶结点B.根结点但不是分支结点 C根结点也是分支结点 D.分支结点但不是根结点(3)F结点的兄弟结点是A.EB.D C.空 D.I(4)F结点的双亲结点是A.AB.BC.CD.D(5)树的深度为A.1B.2C.3D.4(6)B结点的深度为A.1B.2C.3D.4(7)A结点所在的层是A.1B.2C.3D.4..专业知识编辑整理..11.在一棵具有35个结点的完全二叉树中,该树的深度为( )。
数据结构课后习题答案第六章

第六章树和二叉树(下载后用阅读版式视图或web版式可以看清)习题一、选择题1.有一“遗传”关系:设x是y的父亲,则x可以把它的属性遗传给y。
表示该遗传关系最适合的数据结构为( )。
A.向量B.树C图 D.二叉树2.树最合适用来表示( )。
A.有序数据元素 B元素之间具有分支层次关系的数据C无序数据元素 D.元素之间无联系的数据3.树B的层号表示为la,2b,3d,3e,2c,对应于下面选择的( )。
A. la (2b (3d,3e),2c)B. a(b(D,e),c)C. a(b(d,e),c)D. a(b,d(e),c)4.高度为h的完全二叉树至少有( )个结点,至多有( )个结点。
A. 2h_lB.h C.2h-1 D. 2h5.在一棵完全二叉树中,若编号为f的结点存在右孩子,则右子结点的编号为( )。
A. 2iB. 2i-lC. 2i+lD. 2i+26.一棵二叉树的广义表表示为a(b(c),d(e(,g(h)),f)),则该二叉树的高度为( )。
A.3B.4C.5D.67.深度为5的二叉树至多有( )个结点。
A. 31B. 32C. 16D. 108.假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结点数为( )个。
A. 15B. 16C. 17D. 479.题图6-1中,( )是完全二叉树,( )是满二叉树。
1 / 1710.在题图6-2所示的二叉树中:(1)A结点是A.叶结点 B根结点但不是分支结点C根结点也是分支结点 D.分支结点但不是根结点(2)J结点是A.叶结点 B.根结点但不是分支结点C根结点也是分支结点 D.分支结点但不是根结点(3)F结点的兄弟结点是A.EB.D C.空 D.I(4)F结点的双亲结点是A.AB.BC.CD.D(5)树的深度为A.1B.2C.3D.4(6)B结点的深度为A.1B.2C.3D.4(7)A结点所在的层是A.1B.2C.3D.411.在一棵具有35个结点的完全二叉树中,该树的深度为( )。
数据结构第六章图练习题及答案详细解析(精华版)

数据结构第六章图练习题及答案详细解析(精华版)第一篇:数据结构第六章图练习题及答案详细解析(精华版) 图1.填空题⑴ 设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。
【解答】0,n(n-1)/2,0,n(n-1)【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。
⑵ 任何连通图的连通分量只有一个,即是()。
【解答】其自身⑶ 图的存储结构主要有两种,分别是()和()。
【解答】邻接矩阵,邻接表【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。
⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。
【解答】O(n+e)【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。
⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。
【解答】求第j列的所有元素之和⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。
【解答】出度⑺ 图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。
【解答】前序,栈,层序,队列⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal算法求最小生成树的时间复杂度为()。
【解答】O(n2),O(elog2e)【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。
⑼ 如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。
【解答】回路⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。
数据结构答案第6章

数据结构答案第6章第6章数据结构答案1. 栈的应用栈是一种常见的数据结构,其特点是先进后出。
下面是一些关于栈的应用场景。
1.1 函数调用栈在程序中,每当一个函数被调用时,相关的变量和状态信息会被存储在一个称为函数调用栈的栈中。
1.2 表达式求值栈也常用于表达式求值,特别是中缀表达式转后缀表达式的过程中。
通过使用栈,我们可以很方便地进行算术运算。
1.3 逆序输出如果我们需要逆序输出一段文本、字符串或者其他数据,可以使用栈来实现。
将数据依次压入栈中,然后再逐个弹出即可。
2. 队列的实现与应用队列是另一种常见的数据结构,其特点是先进先出。
下面是一些关于队列的实现和应用。
2.1 数组实现队列队列可以使用数组来实现。
我们可以使用两个指针分别指向队列的前端和后端,通过移动指针来实现入队和出队的操作。
2.2 链表实现队列队列还可以使用链表来实现。
我们可以使用一个指针指向队列的头部,并在尾部添加新元素。
通过移动指针来实现出队操作。
2.3 广度优先搜索(BFS)队列常用于广度优先搜索算法。
在BFS中,我们需要按照层级来访问节点。
使用队列可以帮助我们按照顺序存储和访问节点。
3. 树的遍历和应用树是一种非常重要的数据结构,在计算机科学中应用广泛。
下面是一些关于树的遍历和应用的介绍。
3.1 深度优先搜索(DFS)深度优先搜索是树的一种遍历方式。
通过递归或者使用栈的方式,可以按照深度优先的顺序遍历树的所有节点。
3.2 广度优先搜索(BFS)广度优先搜索也可以用于树的遍历。
通过使用队列来保存要访问的节点,可以按照层级的顺序遍历树。
3.3 二叉搜索树二叉搜索树是一种特殊的二叉树,它的每个节点的值都大于左子树中的值,小于右子树中的值。
这种结构可以用于高效地进行数据查找。
4. 图的表示与遍历图是由节点和边组成的一种数据结构。
下面是一些关于图的表示和遍历的说明。
4.1 邻接矩阵表示法邻接矩阵是一种常见的图的表示方法。
使用一个二维数组来表示节点之间的连接关系。
数据结构课后习题(第6章)

【课后习题】第6章树和二叉树网络工程2010级()班学号:姓名:一、填空题(每空1分,共16分)1.从逻辑结构看,树是典型的。
2.设一棵完全二叉树具有999个结点,则此完全二叉树有个叶子结点,有个度为2的结点,有个度为1的结点。
3.由n个权值构成的哈夫曼树共有个结点。
4.在线索化二叉树中,T所指结点没有左子树的充要条件是。
5.在非空树上,_____没有直接前趋。
6.深度为k的二叉树最多有结点,最少有个结点。
7.若按层次顺序将一棵有n个结点的完全二叉树的所有结点从1到n编号,那么当i为且小于n时,结点i的右兄弟是结点,否则结点i没有右兄弟。
8.N个结点的二叉树采用二叉链表存放,共有空链域个数为。
9.一棵深度为7的满二叉树有___ ___个非终端结点。
10.将一棵树转换为二叉树表示后,该二叉树的根结点没有。
11.采用二叉树来表示树时,树的先根次序遍历结果与其对应的二叉树的遍历结果是一样的。
12.一棵Huffman树是带权路径长度最短的二叉树,权值的外结点离根较远。
二、判断题(如果正确,在对应位置打“√”,否则打“⨯”。
每题0.5分,共5分)1.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i-1个结点。
2.二叉树的前序遍历并不能唯一确定这棵树,但是,如果我们还知道该二叉树的根结点是那一个,则可以确定这棵二叉树。
3.一棵树中的叶子结点数一定等于与其对应的二叉树中的叶子结点数。
4.度≤2的树就是二叉树。
5.一棵Huffman树是带权路径长度最短的二叉树,权值较大的外结点离根较远。
6.采用二叉树来表示树时,树的先根次序遍历结果与其对应的二叉树的前序遍历结果是一样的。
7.不存在有偶数个结点的满二叉树。
8.满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树。
9.已知二叉树的前序遍历顺序和中序遍历顺序,可以惟一确定一棵二叉树;10.已知二叉树的前序遍历顺序和后序遍历顺序,不能惟一确定一棵二叉树;三、单项选择(请将正确答案的代号填写在下表对应题号下面。
数据结构肖启宏课后习题答案第六章

一.名词解释(1)结点—— 树的结点包含一个数据及若干指向其子树的分支。
(2)结点的度—— 结点所拥有的子树数称为该结点的度。
(3)树的度—— 树中各结点度的最大值称为该树的度。
(4)二叉树—— 一棵非空的二叉树,每个结点至多只有两棵子树,分别称为左子树和右子树,左、右子树的次序不能任意交换,且左右子树又分别是一棵二叉树。
(5)哈夫曼树—— 带权路径长度最小的二叉树,即最优二叉树,也称为哈夫曼树。
二.判断题(下列各题,正确的请在前面的括号内打√;错误的打ㄨ) (1)√ (2)ㄨ (3)√ (4)√(5)√(6)ㄨ (7)ㄨ(8)√三.填空题1.结点拥有的子树数 2.度为零的3. 树内各结点度的最大值 4.深度(或高度) 5.2i-1 6. 2h -1 7. n-1 8.6 9.中序 10.5 11.20 12. ⎣⎦1log 2+n13.顺序存储结构和链式存储结构 14.最小 15.EBCAD16.(1) ABEFHCG (2).EBHFACG (3).EHFBGCA 17.空二叉树 18.4四.选择题(1)B (2)C (3)C (4)C (5)D(6)B (7)A (8)B (9)D (10)D(11)B (12)A (13)C五.简答题1.答:一般树(非空)除了根结点之外,每个结点有且仅有一个前驱结点,但每个结点都可以有多个互不相交的子集(后继结点)。
二叉树(若非空)除了根结点之外,每个结点有且仅有一个前驱结点,但每个结点至多只有两个后继结点,称为左子树和右子树,左、右子树的次序不能交换,且左右子树又分别都是二叉树。
一般树和二叉树主要有以下区别:二叉树结点的度最大为2,而一般树结点的最大度数无限制;一般树的结点无左、右之分,而二叉树的结点有左、右之分。
2.答:一棵度为2的树与一棵二叉树的区别在于:对于度为1的结点,度为2的树无须区分左右;对于二叉树必须有左右之分,且不能任意交换。
3.答:(1)A是根结点。
数据结构(C语言版)第6章练习 清华大学出版社

第六章数据结构作业第六章树选择题1.已知一算术表达式的中缀形式为 A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为( ) A.-A+B*C/DE B. -A+B*CD/E C.-+*ABC/DE D. -+A*BC/DE2.算术表达式a+b*(c+d/e)转为后缀表达式后为()A.ab+cde/* B.abcde/+*+ C.abcde/*++ D.abcde*/++3. 设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T中的叶子数为()A.5 B.6 C.7 D.84. 设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵树的结点个数是()A.m-n B.m-n-1 C.n+1 D.条件不足,无法确定5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B.11 C.15 D.不确定6.具有10个叶结点的二叉树中有()个度为2的结点,A.8 B.9 C.10 D.ll7.一棵完全二叉树上有1001个结点,其中叶子结点的个数为()A. 250 B. 500 C.254 D.505 E.以上答案都不对8. 有n个叶子的哈夫曼树的结点总数为()。
A.不确定 B.2n C.2n+1 D.2n-19. 一棵具有 n个结点的完全二叉树的树高度(深度)是()A.⎣logn⎦+1 B.logn+1 C.⎣logn⎦ D.logn-110.深度为h的满m叉树的第k层有()个结点。
(1=<k=<h)A.m k-1 B.m k-1 C.m h-1 D.m h-111.在一棵高度为k的满二叉树中,结点总数为()A.2k-1 B.2k C.2k-1 D.⎣log2k⎦+112.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用( )次序的遍历实现编号。
数据结构第6章作业答案

1第6章 作业答案1. 由3个结点所构成的二叉树有 5 种形态。
2. 一棵深度为6的满二叉树有 n 1+n 2=0+ n 2= n 0-1=31 个分支结点和 26-1 =32 个叶子。
注:满二叉树没有度为1的结点,所以分支结点数就是二度结点数。
3. 设一棵完全二叉树具有1000个结点,则此完全二叉树有 500 个叶子结点,有 499 个度为2的结点,有 1 个结点只有非空左子树,有 0 个结点只有非空右子树。
答:最快方法:用叶子数=[n/2]=500 ,n 2=n 0-1=499。
另外,最后一结点为2i 属于左叶子,右叶子是空的,所以有1个非空左子树。
完全二叉树的特点决定不可能有左空右不空的情况,所以非空右子树数=0.4. 二叉树的基本组成部分是:根(N )、左子树(L )和右子树(R )。
因而二叉树的遍历次序有六种。
最常用的是三种:前序法(即按N L R 次序),后序法(即按 L R N 次序)和中序法(也称对称序法,即按L N R 次序)。
这三种方法相互之间有关联。
若已知一棵二叉树的前序序列是BEFCGDH ,中序序列是FEBGCHD ,则它的后序序列必是 F E G H D C B 。
解:法1:先由已知条件画图,再后序遍历得到结果;法2:不画图也能快速得出后序序列,只要找到根的位置特征。
由前序先确定root ,由中序先确定左子树。
例如,前序遍历BEFCGDH 中,根结点在最前面,是B ;则后序遍历中B 一定在最后面。
法3:递归计算。
如B 在前序序列中第一,中序中在中间(可知左右子树上有哪些元素),则在后序中必为最后。
如法对B 的左右子树同样处理,则问题得解。
5. 用5个权值{3, 2, 4, 5, 1}构造的哈夫曼(Huffman )树的带权路径长度是 33 。
解:先构造哈夫曼树,得到各叶子的路径长度之后便可求出WPL =(4+5+3)×2+(1+2)×3=33 (15)(9) (6) (注:两个合并值先后不同会导致编码不同,即哈夫曼编码不唯一) 4 5 3 (3) (注:合并值应排在叶子值之后)1 26.一棵度为2的树与一棵二叉树有何区别?答:度为2的树从形式上看与二叉树很相似,但它的子树是无序的,而二叉树是有序的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上机题(1)编写完整程序,用先序遍历法建立二叉树的二叉链表存储结构。
输出该二叉树的先、中、后序遍历结点访问次序以及层次遍历结点访问次序。
(建议结点数据域类型为char)// erchashu.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include<stdio.h>#include<stdlib.h>typedef struct node{char data;struct node *lchild, *rchild;}*BiT, BiTNode;BiT crtBT(){char ch;BiT bt;ch=getchar();if(ch=='#')return NULL;bt=new BiTNode();bt->data=ch;bt->lchild=crtBT();bt->rchild=crtBT();return bt;}void preorder(BiT bt){if(bt){printf("%c",bt->data);preorder(bt->lchild);preorder(bt->rchild);}//printf("\n");}void midorder(BiT bt){if(bt){midorder(bt->lchild);printf("%c",bt->data);midorder(bt->rchild);}//printf("\n");}void lasorder(BiT bt){if(bt){lasorder(bt->lchild);lasorder(bt->rchild);printf("%c",bt->data);}//printf("\n");}int main(int argc, char* argv[]){BiT bt;bt=crtBT();preorder(bt);printf("\n");midorder(bt);printf("\n");lasorder(bt);printf("\n");return 0;}(2)从键盘输入n个数据建立n元完全二叉树顺序存储结构。
实现该完全二叉树的先、中、后序遍历。
#include "stdafx.h"#include<stdio.h>#include<stdlib.h>void preorder(int j,int i,char *s) {if (j>i) return;printf("%c",s[j]);preorder(j*2+1,i,s);preorder(j*2+2,i,s);}void midorder(int j,int i,char *s) {if (j>i) return;preorder(j*2+1,i,s);printf("%c",s[j]);preorder(j*2+2,i,s);}void lasorder(int j,int i,char *s) {if (j>i) return;preorder(j*2+1,i,s);preorder(j*2+2,i,s);printf("%c",s[j]);}int main(int argc, char* argv[]){int i=0;char *bt;char s[100];scanf("%s",s);bt=s;while(s[i]!=0){i++;}//printf("%d\n",i);preorder(0,i,bt);printf("\n");midorder(0,i,bt);printf("\n");lasorder(0,i,bt);printf("\n");return 0;}算法(1)已知二叉树(二叉链表)根结点指针为bt,求该二叉树中的叶子数目。
int preorder(BiT bt){int k=0;if(bt){if(!bt->lchild&&!bt->rchild) k++;preorder(bt->lchild);preorder(bt->rchild);}return k;}(2)已知某二叉树(三叉链表)的根结点地址root,该树中各结点的左、右儿子指针域已正确填充,写一个算法将所有结点的双亲指针域正确填充。
void preorder(BiT bt){if(bt==root) return ;if(bt){bt->lchild->parent=bt;bt->rchild->parent=bt;preorder(bt->lchild);preorder(bt->rchild);}}(3)已知某二叉树(二叉链表)的根结点指针bt。
编写算法,将该二叉树中所有结点的左右子树互换。
void preorder(BiT bt){char c;if(bt){c=bt->lchild;bt->lchild=bt->rchild;bt->rchild=c;preorder(bt->lchild);preorder(bt->rchild);}}(4) 已知n个结点的完全二叉树结点数据域值按结点编号次序顺序存于一维数组(元素下标范围0..n-1)。
编写算法,由该数组首地址以及数组长度n建立对应的二叉链表存储结构。
void preorder(BiT bt,int n,char *s,int j){if(bt){bt->lchild=s[2*j+1];bt->rchild=s[2*j+2];preorder(bt->lchild);preorder(bt->rchild);}}/*调用方式数组:ch[n];s=ch;j=0;preorder(BiT bt,int n ,char *s,int j)*/上机题(1)编写完整程序,实现中序遍历线索二叉树存储结构、线索化以及中序遍历。
#include "stdafx.h"#include<stdio.h>#include<stdlib.h>enum PT { LINK, THREAD };typedef struct node{ char data;struct node *lchild, *rchild;enum PT ltag, rtag;} *SBiT, SBiT_Node;SBiT crtSBT(){char ch;SBiT bt;ch=getchar();if(ch=='#')return NULL;bt=new SBiT_Node();bt->data=ch;bt->lchild=crtSBT();bt->rchild=crtSBT();return bt;}SBiT first(SBiT bt){ while(bt&&bt->ltag==LINK) bt=bt->lchild; return bt;}/SBiT next(SBiT p){ if(p->rtag==THREAD) return p->rchild; return first(p->rchild);}void midtravel(SBiT p,SBiT root){ p=first(root);while(p) { printf("%c",p->data); p=next(p); } }void mit(SBiT bt, SBiT &pr){ if(bt){ mit(bt->lchild, pr);if(pr) if(pr->rchild) pr->rtag=LINK;else { pr->rtag=THREAD; pr->rchild=bt; }if(bt->lchild) bt->ltag=LINK;else { bt->ltag=THREAD; bt->lchild=pr; }pr=bt;mit(bt->rchild, pr);}}int main(int argc, char* argv[]){SBiT bt;bt=crtSBT();SBiT pr=NULL;mit(bt, pr);pr->rtag=THREAD;midtravel(pr,pr);printf("\n");return 0;}(2) 编写完整程序,用堆栈实现前/中/后序非递归遍历,并与递归遍历结果比较。
#include<stdio.h>#include<stdlib.h>typedef struct Node{char data;Node *leftchild;Node *rightchild;}Node;/*初始化一棵二叉树排序树。
*/void InitBinaryTree(Node**root,char elem){*root=(Node*)malloc(sizeof(Node));if(!(*root)){printf("Memory allocation for root failed.\n");return;}(*root)->data=elem;(*root)->leftchild=NULL;(*root)->rightchild=NULL;}/*向二叉树排序树中插入结点。
*/void InsertNode(Node *root,char elem){Node *newnode=NULL;Node *p=root,*last_p=NULL;newnode=(Node*)malloc(sizeof(Node));if(!newnode){printf("Memory allocation for newnode failed.\n");return;}newnode->data=elem;newnode->leftchild=NULL;newnode->rightchild=NULL;while(NULL!=p){last_p=p;if(newnode->data<p->data){p=p->leftchild;}else if(newnode->data>p->data){p=p->rightchild;}else{printf("Node to be inserted has existed.\n");free(newnode);return;}}p=last_p;if(newnode->data<p->data){p->leftchild=newnode;}else{p->rightchild=newnode;}}/*创建一棵二叉树排序树。