假设二叉树采用二叉链存储结构存储

合集下载

数据结构 试题(A)-答案

数据结构 试题(A)-答案
评分标准:有向图、无向图两种存储方式各占4分。
3.建立平衡二叉树过程如图2所示(图中加阴影的结点表示要调整的结点)。
图2构造平衡二叉树过程
评分标准:每次调整占1分。
4.答:不能。因为在这里,二分查找只减少了关键字间的比较次数,而记录的移动次数不变,时间的复杂度仍为O(n2)。
评分标准:答对“不能”占3分,说明理由占5分。
A.872B.860
C.868D.864
8.一个具有1025个结点的二叉树的高h为。
A.11B.10
C.11~1025D.12~1024
9.一棵二叉树的后序遍历序列为DABEC,中序遍历序列为DEBAC,则先序遍历序列为。
A.ACBEDB.DECAB
C.DEABCD.CEDBA
10.对图1所示的无向图,从顶点1开始进行深度优先遍历;可得到顶点访问序列。
2.给出如下各种情况下求任意一个顶点的度的过程(只需文字描述):(8分)
(1)含n个顶点的无向图采用邻接矩阵存储;
(2)含n个顶点的无向图采用邻接表存储;
(3)含n个顶点的有向图采用邻接矩阵存储;
(4)含n个顶点的有向图采用邻接表存储。
3.将整数序列{4,5,7,2,1,3,6}中的数依次插入到一棵空的平衡二叉树中,试构造相应的平衡二叉树。(要求画出每个元素插入过程,若需调整,还需给出调整后的结果,并指出是什么类型的调整,12分)
A.输出第i(1≤i≤n)个元素值
B.交换第1个元素与第2个元素的值
C.顺序输出这n个元素的值
D.输出与给定值x相等的元素在线性表中的序号
4.设n个元素进栈序列是p1,p2,p3,…,pn,其输出序列是1,2,3,…,n,若p3=3,则p1的值。
A.可能是2B.一定是2

第七章和第八章补充练习题(答案)

第七章和第八章补充练习题(答案)

7.3补充练习题及参考答案7.3.1单项选择题1.对于一棵具有n 个结点、度为4的树来说,_____________.A.树的高度最多是n-3B.树的高度最多是是n-4C.第i 层上最多有4(i-1)个结点D.至少在某一层上正好有4个结点答:这样的树中至少有一个结点的度为4,也就是说,至少有一层中有4个或以上的结点,因此树的高度最多是n-3。

本题的答案为A 。

2.度为4、高度为h 的树_____________.A.至少有h+3个结点B.最多有4h -1个结点C.最多有4h 个结点D.至少有h+4个结点答:与上小题分析相同,本题的答案为A 。

3.对于一棵具有n 个结点、度为4的树来说,树的高度至少是_____________.A.)]2([log 4nB.)]13([log 4-nC.)]13([log 4+nD.)]12([log 4+n答:由树的性质4可知,具有n 个结点的m 次树的最小高度为)]1)1(([log +-m n m 。

这里m=4,因此最小高度为)]13([log 4+n 。

本题的答案为C 。

4.在一棵3次树中度为3的结点数为两个,度为2的结点数为一个,度为1的结点数为两个,则度为0的结点数为_____________个。

A.4B.5C.6D.7答:3n =2,2n =1,1n =2,001235n n n n n n +=+++=,n=度之和+1=33n +22n +1n +1=11, 所以65110=-=n 。

本题的答案为C 。

5.若一棵有n 个结点的树,其中所有分支结点的度均为k,该树中的叶子结点个数 是_____________。

A.n(k 一1)/kB.n-kC.(n+1)/kD.(nk 一n+1)/k答:m=k,有k n n n +=0,度之和=n-1=k kn ,k n n k /)1(-=,所以0n =n-k n =n-(n-1)/k=(nk-n+1)/k.本题的答案为D 。

数据结构参考答案

数据结构参考答案

简答一.1、已知模式串pat=’ADABBADADA’,写出该模式串的next函数值和nextval值;2、模式匹配算法是在主串中快速寻找模式的一种有效的方法,如果设主串的长度为m,模式的长度为n,则在主串中寻找模式的KMP算法的时间复杂性是多少?如果,某一模式 P=’abcaacabaca’,请给出它的NEXT函数值及NEXT函数的修正值NEXTVAL之值。

3、已知模式串pat=“abaabc”,写出该模式串的next函数值和nextval值;4、给出字符串‘abacabaaad’在KMP算法中的next和nextval数组。

二、(意思对即可,不一定是这种写法)1、数据结构按照逻辑结构分为哪四种结构,说出元素之间的关系?集合:无关系线性结构:一对一树形结构:一对多图形结构:多对多2、图形结构有几种存储结构?分别是什么存储结构?4种。

邻接矩阵,邻接表,十字链表,邻接多重表3、度数为2的树和二叉树有何区别?(1)度为2的树中至少有一个结点的度为2,而二叉树中没有这种要求。

(2)度为2的树不区分左右子树,而二叉树严格区分左右子树。

4、简述栈和队列的特点。

栈:是一种只能在一端进行插入或删除操作的线性表。

“后进先出”队列:是一种仅允许在表的一端进行插入操作,而在表的另一端进行删除操作的受限的线性表“先进先出”三(只是最终的结果,有的题可能需要中间步骤,自己完善一下)1、已知某有向图的顶点集合为{A,B,C,D,E,F},边集合为{〈A,B〉,〈A,C〉,〈A,E〉,〈C,F〉,〈E,D〉},画出该图的邻接表,以它为基写出深度优先、广度优先遍历序列(深度、广度遍历要求从结点A开始)。

深度:A B C F E D广度:A B C E F D2、设无向图G(如右图所示),给出该图的最小生成树上边的集合并计算最小生成树各边上的权值之和。

3、对下图所示的无向图,从顶点1开始,写出该图的深度优先遍历和广度优先遍历。

《数据结构及其应用》笔记含答案 第五章_树和二叉树

《数据结构及其应用》笔记含答案 第五章_树和二叉树

第5章树和二叉树一、填空题1、指向结点前驱和后继的指针称为线索。

二、判断题1、二叉树是树的特殊形式。

()2、完全二叉树中,若一个结点没有左孩子,则它必是叶子。

()3、对于有N个结点的二叉树,其高度为。

()4、满二叉树一定是完全二叉树,反之未必。

()5、完全二叉树可采用顺序存储结构实现存储,非完全二叉树则不能。

()6、若一个结点是某二叉树子树的中序遍历序列中的第一个结点,则它必是该子树的后序遍历序列中的第一个结点。

()7、不使用递归也可实现二叉树的先序、中序和后序遍历。

()8、先序遍历二叉树的序列中,任何结点的子树的所有结点不一定跟在该结点之后。

()9、赫夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。

()110、在赫夫曼编码中,出现频率相同的字符编码长度也一定相同。

()三、单项选择题1、把一棵树转换为二叉树后,这棵二叉树的形态是(A)。

A.唯一的B.有多种C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子解释:因为二叉树有左孩子、右孩子之分,故一棵树转换为二叉树后,这棵二叉树的形态是唯一的。

2、由3个结点可以构造出多少种不同的二叉树?(D)A.2 B.3 C.4 D.5解释:五种情况如下:3、一棵完全二叉树上有1001个结点,其中叶子结点的个数是(D)。

A.250 B. 500 C.254 D.501解释:设度为0结点(叶子结点)个数为A,度为1的结点个数为B,度为2的结点个数为C,有A=C+1,A+B+C=1001,可得2C+B=1000,由完全二叉树的性质可得B=0或1,又因为C为整数,所以B=0,C=500,A=501,即有501个叶子结点。

4、一个具有1025个结点的二叉树的高h为(C)。

A.11 B.10 C.11至1025之间 D.10至1024之间解释:若每层仅有一个结点,则树高h为1025;且其最小树高为⎣log21025⎦ + 1=11,即h在11至1025之间。

计算机408统考真题

计算机408统考真题

计算机专业基础综合考试模拟试卷(一)一、单项选择题:第1~40小题,每小题2分,共80分。

下列每题给出的四个选项中,只有一个选项最符合试题要求。

1.已知一个栈的进栈序列是1、2、3、…、n,其输出序列为p1、p2、p3、…、p n,若p1=3,则p2为()。

A.2或4、5、…、n都有可能B.可能是1C.一定是2 D.只可能是2或4 2.利用栈求表达式的值时,设立运算数栈OPEN。

假设OPEN只有两个存储单元,则在下列表达式中,不会发生溢出的是()。

A.A−B*(C−D) B.(A−B)*C−D C.(A−B*C)−DD.(A−B)*(C−D)3.已知A[1…N]是一棵顺序存储的完全二叉树,9号结点和11号结点共同的祖先是()。

A.4 B.6 C.2D.84.在常用的描述二叉排序树的存储结构中,关键字值最大的结点是()。

A.左指针一定为空B.右指针一定为空C.左、右指针均为空D.左、右指针均不为空5.分别以下列序列构造二叉排序树,与用其他三个序列所构造的结果不同的是()。

A.(100,80, 90,60,120,110,130)B.(100,120,110,130,80,60,90)C.(100,60,80,90,120,110,130)D.(100,80, 60,90,120,130,110)6.设无向图G=(V,E)和G′=(V′,E′),如果G′是G的生成树,则下面说法错误的是()。

A.G′是G的子图B.G′是G的连通分量C.G′是G的极小连通子图且V=V′D.G′是G的一个无环子图7.若G是一个具有36条边的非连通无向简单图,则图G的结点数至少是()。

A.11 B.10 C.9D.88.在有向图G的拓扑序列中,若顶点V i在顶点V j之前,则下列情形不可能出现的是()。

A.G中有弧<V i,V j> B.G中有一条从V i到V j的路径C.G中没有弧< V i,V j> D.G中有一条从V j到V i的路径9.具有12个关键字的有序表中,对每个关键字的查找概率相同,折半查找查找成功和查找失败的平均查找长度依次为()。

数据结构期末考试试题(含答案)

数据结构期末考试试题(含答案)

数据结构期末考试试题(含答案)2005年-2006学年第⼆学期“数据结构”考试试题(A)姓名学号(序号)_答案隐藏班号要求:所有的题⽬的解答均写在答题纸上(每张答题纸上要写清楚姓名、班号和学号),需写清楚题⽬的序号。

每张答题纸都要写上姓名和序号。

⼀、单项选择题(每⼩题2分,共20分)1.数据的运算a 。

A.效率与采⽤何种存储结构有关B.是根据存储结构来定义的C.有算术运算和关系运算两⼤类D.必须⽤程序设计语⾔来描述答:A。

2.链表不具备的特点是 a 。

A.可随机访问任⼀结点B.插⼊删除不需要移动元素C.不必事先估计存储空间D.所需空间与其长度成正⽐答:参见本节要点3。

本题答案为:A。

3.在顺序表中删除⼀个元素的时间复杂度为 c 。

A.O(1)B.O(log2n)C.O(n)D.O(n2)答:C。

4.以下线性表的存储结构中具有随机存取功能的是d 。

A.不带头结点的单链表B.带头结点的单链表C.循环双链表D.顺序表解D。

5.⼀个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是c 。

A.edcba B.decbaC.dceabD.abcde答:C。

6.循环队列qu的队空条件是 d 。

A. (qu.rear+1)%MaxSize==(qu.front+1)%MaxSizeB. (qu.rear+1)%MaxSize==qu.front+1C.(qu.rear+1)%MaxSize==qu.frontD.qu.rear==qu.front答:D。

7.两个串相等必有串长度相等且 b 。

A.串的各位置字符任意B.串中各位置字符均对应相等C.两个串含有相同的字符D.两个所含字符任意答:B。

8.⽤直接插⼊排序对下⾯四个序列进⾏递增排序,元素⽐较次数最少的是c 。

A.94,32,40,90,80,46,21,69B.32,40,21,46,69,94,90,80C.21,32,46,40,80,69,90,94D.90,69,80,46,21,32,94,40答:C。

数据结构教程李春葆课后答案第7章树和二叉树

数据结构教程李春葆课后答案第7章树和二叉树
第 7 章 树和二叉树
教材中练习题及参考答案
1. 有一棵树的括号表示为 A(B,C(E,F(G)),D),回答下面的问题: (1)指出树的根结点。 (2)指出棵树的所有叶子结点。 (3)结点 C 的度是多少? (4)这棵树的度为多少? (5)这棵树的高度是多少? (6)结点 C 的孩子结点是哪些? (7)结点 C 的双亲结点是谁? 答:该树对应的树形表示如图 7.2 所示。 (1)这棵树的根结点是 A。 (2)这棵树的叶子结点是 B、E、G、D。 (3)结点 C 的度是 2。 (4)这棵树的度为 3。 (5)这棵树的高度是 4。 (6)结点 C 的孩子结点是 E、F。 (7)结点 C 的双亲结点是 A。
12. 假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法 计算一棵给定二叉树 b 中的所有单分支结点个数。 解:计算一棵二叉树的所有单分支结点个数的递归模型 f(b)如下:
f(b)=0 若 b=NULL
6 f(b)=f(b->lchild)+f(b->rchild)+1 f(b)=f(b->lchild)+f(b->rchild)
表7.1 二叉树bt的一种存储结构 1 lchild data rchild 0 j 0 2 0 h 0 3 2 f 0 4 3 d 9 5 7 b 4 6 5 a 0 7 8 c 0 8 0 e 0 9 10 g 0 10 1 i 0
答:(1)二叉树bt的树形表示如图7.3所示。
a b c e h j f i d g e h j c f i b d g a
对应的算法如下:
void FindMinNode(BTNode *b,char &min) { if (b->data<min) min=b->data; FindMinNode(b->lchild,min); //在左子树中找最小结点值 FindMinNode(b->rchild,min); //在右子树中找最小结点值 } void MinNode(BTNode *b) //输出最小结点值 { if (b!=NULL) { char min=b->data; FindMinNode(b,min); printf("Min=%c\n",min); } }

数据结构算法设计题

数据结构算法设计题

一、算法设计题1. 设二叉树bt采用二叉链表结构存储。

试设计一个算法输出二叉树中所有非叶子结点,并求出非叶子结点的个数。

【答案】int count=0;void algo2(BTNode *bt){if (bt){if(bt->lchild || bt->rchild){printf(bt->data);count++;}algo2(bt->lchild);algo2(bt->rchild);}}2. 阅读下列函数arrange()int arrange(int a[],int 1,int h,int x){//1和h分别为数据区的下界和上界int i,j,t;i=1;j=h;while(i<j){while(i<j && a[j]>=x)j--;while(i<j && a[j]>=x)i++;if(i<j){ t=a[j];a[j]=a[i];a[i]=t;}}if(a[i]<x) return i;else return i-1;}(1)写出该函数的功能;(2)写一个调用上述函数实现下列功能的算法:对一整型数组b[n]中的元素进行重新排列,将所有负数均调整到数组的低下标端,将所有正数均调整到数组的高下标端,若有零值,则置于两者之间,并返回数组中零元素的个数。

【答案】(1)该函数的功能是:调整整数数组a[]中的元素并返回分界值i,使所有<x的元素均落在a[1..i]上,使所有≥x的元素均落在a[i+1..h]上。

(2)int f(int b[],int n) 或 int f(int b[],int n){ {int p,q; int p,q;p=arrange(b,0,n-1,0); p=arrange(b,0,n-1,1);q= arrange(b,p+1,n-1,1); q= arrange(b,0,p,0);return q-p; return p-q;} }3. 假设线性表以带表头结点的循环单链表表示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

假设二叉树采用二叉链存储结构存储,分别实现以下算法,并在程序中完成测试:(1)计算二叉树节点个数;(2)输出所有叶子节点;(3)求二叉树b的叶子节点个数;(4)求二叉树b的宽度#include<>#include<>#define MaxSize 100typedef char ElemType;typedef struct node{ElemType data; //数据元素struct node *lchild; //指向左孩子struct node *rchild; //指向右孩子} BTNode;void CreateBTNode(BTNode *&b,char *str); //由str串创建二叉链BTNode *FindNode(BTNode *b,ElemType x); //返回data域为x的节点指针BTNode *LchildNode(BTNode *p); //返回*p节点的左孩子节点指针BTNode *RchildNode(BTNode *p); //返回*p节点的右孩子节点指针int BTNodeDepth(BTNode *b); //求二叉树b的深度void DispBTNode(BTNode *b); //以括号表示法输出二叉树void DestroyBTNode(BTNode *&b); //销毁二叉树void LevelOrder(BTNode *b){BTNode *p;BTNode *qu[MaxSize]; //定义环形队列,存放节点指针int front,rear; //定义队头和队尾指针front=rear=-1; //置队列为空队列rear++;qu[rear]=b; //根节点指针进入队列while (front!=rear) //队列不为空{front=(front+1)%MaxSize;p=qu[front]; //队头出队列printf("%c ",p->data); //访问节点if (p->lchild!=NULL) //有左孩子时将其进队{rear=(rear+1)%MaxSize;qu[rear]=p->lchild;}if (p->rchild!=NULL) //有右孩子时将其进队{rear=(rear+1)%MaxSize;qu[rear]=p->rchild;}}}void CreateBTNode(BTNode *&b,char *str) //由str串创建二叉链{BTNode *St[MaxSize],*p=NULL;int top=-1,k,j=0;char ch;b=NULL; //建立的二叉树初始时为空ch=str[j];while (ch!='\0') //str未扫描完时循环{switch(ch){case'(':top++;St[top]=p;k=1;break; //为左节点case')':top--;break;case',':k=2;break; //为右节点default:p=(BTNode *)malloc(sizeof(BTNode));p->data=ch;p->lchild=p->rchild=NULL;if (b==NULL) //p指向二叉树的根节点b=p;else//已建立二叉树根节点 {switch(k){case 1:St[top]->lchild=p;break;case 2:St[top]->rchild=p;break;}}}j++;ch=str[j];}}BTNode *FindNode(BTNode *b,ElemType x) //返回data域为x的节点指针{BTNode *p;if (b==NULL)return NULL;else if (b->data==x)return b;else{p=FindNode(b->lchild,x);if (p!=NULL)return p;elsereturn FindNode(b->rchild,x);}}BTNode *LchildNode(BTNode *p) //返回*p节点的左孩子节点指针{return p->lchild;}BTNode *RchildNode(BTNode *p) //返回*p节点的右孩子节点指针{return p->rchild;}int BTNodeDepth(BTNode *b) //求二叉树b的深度{int lchilddep,rchilddep;if (b==NULL)return(0); //空树的高度为0 else{lchilddep=BTNodeDepth(b->lchild); //求左子树的高度为lchilddep rchilddep=BTNodeDepth(b->rchild); //求右子树的高度为rchilddepreturn (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1); }}void DispBTNode(BTNode *b) //以括号表示法输出二叉树{if (b!=NULL){printf("%c",b->data);if (b->lchild!=NULL || b->rchild!=NULL){printf("(");DispBTNode(b->lchild);if (b->rchild!=NULL) printf(",");DispBTNode(b->rchild);printf(")");}}}void DestroyBTNode(BTNode *&b) //销毁二叉树{if (b!=NULL){DestroyBTNode(b->lchild);DestroyBTNode(b->rchild);free(b);}}void PreOrder1(BTNode *b){BTNode *St[MaxSize],*p;int top=-1;if (b!=NULL){top++; //根节点入栈St[top]=b;while (top>-1) //栈不为空时循环{p=St[top]; //退栈并访问该节点top--;printf("%c ",p->data);if (p->rchild!=NULL) //右孩子入栈{top++;St[top]=p->rchild;}if (p->lchild!=NULL) //左孩子入栈{top++;St[top]=p->lchild;}}printf("\n");}}void InOrder1(BTNode *b){BTNode *St[MaxSize],*p;int top=-1;if (b!=NULL){p=b;while (top>-1 || p!=NULL){while (p!=NULL){top++;St[top]=p;p=p->lchild;}if (top>-1){p=St[top];top--;printf("%c ",p->data);p=p->rchild;}}printf("\n");}}void PostOrder1(BTNode *b){BTNode *St[MaxSize];BTNode *p;int flag,top=-1; //栈指针置初值if (b!=NULL){do{while (b!=NULL) //将t的所有左节点入栈{top++;St[top]=b;b=b->lchild;}p=NULL; //p指向当前节点的前一个已访问的节点 flag=1;while (top!=-1 && flag){b=St[top]; //取出当前的栈顶元素if (b->rchild==p) //右子树不存在或已被访问,访问之{printf("%c ",b->data); //访问*b节点top--;p=b; //p指向则被访问的节点}else{b=b->rchild; //t指向右子树flag=0;}}}while (top!=-1);printf("\n");}}int main(){BTNode *b;CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");printf("二叉树b: ");DispBTNode(b);printf("\n");printf("先序遍历序列:\n");PreOrder1(b);printf("中序遍历序列:\n");InOrder1(b);printf("后序遍历序列:\n"); PostOrder1(b);DestroyBTNode(b);getchar();}。

相关文档
最新文档