数据结构作业系统第七章复习资料
数据结构课后习题答案第七章

第七章图(参考答案)7.1(1)邻接矩阵中非零元素的个数的一半为无向图的边数;(2)A[i][j]= =0为顶点,I 和j无边,否则j和j有边相通;(3)任一顶点I的度是第I行非0元素的个数。
7.2(1)任一顶点间均有通路,故是强连通;(2)简单路径V4 V3 V1 V2;(3)0 1 ∞ 1∞ 0 1 ∞1 ∞ 0 ∞∞∞ 1 0邻接矩阵邻接表(2)从顶点4开始的DFS序列:V5,V3,V4,V6,V2,V1(3)从顶点4开始的BFS序列:V4,V5,V3,V6,V1,V27.4(1)①adjlisttp g; vtxptr i,j; //全程变量② void dfs(vtxptr x)//从顶点x开始深度优先遍历图g。
在遍历中若发现顶点j,则说明顶点i和j间有路径。
{ visited[x]=1; //置访问标记if (y= =j){ found=1;exit(0);}//有通路,退出else { p=g[x].firstarc;//找x的第一邻接点while (p!=null){ k=p->adjvex;if (!visited[k])dfs(k);p=p->nextarc;//下一邻接点}}③ void connect_DFS (adjlisttp g)//基于图的深度优先遍历策略,本算法判断一邻接表为存储结构的图g种,是否存在顶点i //到顶点j的路径。
设 1<=i ,j<=n,i<>j.{ visited[1..n]=0;found=0;scanf (&i,&j);dfs (i);if (found) printf (” 顶点”,i,”和顶点”,j,”有路径”);else printf (” 顶点”,i,”和顶点”,j,”无路径”);}// void connect_DFS(2)宽度优先遍历全程变量,调用函数与(1)相同,下面仅写宽度优先遍历部分。
数据结构第七章参考答案

习题71.填空题(1)由10000个结点构成的二叉排序树,在等概率查找的条件下,查找成功时的平均查找长度的最大值可能达到(___________)。
答案:5000.5(2)长度为11的有序序列:1,12,13,24,35,36,47,58,59,69,71进行等概率查找,如果采用顺序查找,则平均查找长度为(___________),如果采用二分查找,则平均查找长度为(___________),如果采用哈希查找,哈希表长为15,哈希函数为H(key)=key%13,采用线性探测解决地址冲突,即d i=(H(key)+i)%15,则平均查找长度为(保留1位小数)(___________)。
答案:6,3,1.6(3)在折半查找中,查找终止的条件为(___________)。
答案:找到匹配元素或者low>high?(4)某索引顺序表共有元素275个,平均分成5块。
若先对索引表采用顺序查找,再对块元素进行顺序查找,则等概率情况下,分块查找成功的平均查找长度是(___________)。
答案:31(5)高度为8的平衡二叉树的结点数至少是(___________)。
答案: 54 计算公式:F(n)=F(n-1)+F(n-2)+1(6)对于这个序列{25,43,62,31,48,56},采用的散列函数为H(k)=k%7,则元素48的同义词是(___________)。
答案:62(7)在各种查找方法中,平均查找长度与结点个数无关的查找方法是(___________)。
答案:散列查找(8)一个按元素值排好的顺序表(长度大于2),分别用顺序查找和折半查找与给定值相等的元素,平均比较次数分别是s和b,在查找成功的情况下,s和b的关系是(___________);在查找不成功的情况下,s和b的关系是(___________)。
答案:(1)(2s-1)b=2s([log2(2s-1)]+1)-2[log2(2s-1)]+1+1(2)分两种情况考虑,见解答。
数据结构第七章的习题答案

数据结构第七章的习题答案数据结构第七章的习题答案数据结构是计算机科学中非常重要的一门学科,它研究如何组织和管理数据以便高效地访问和操作。
第七章是数据结构课程中的一个关键章节,它涵盖了树和二叉树这两个重要的数据结构。
本文将为读者提供第七章习题的详细解答,帮助读者更好地理解和掌握这些概念。
1. 问题:给定一个二叉树,如何判断它是否是二叉搜索树?解答:要判断一个二叉树是否是二叉搜索树,我们可以使用中序遍历的方法。
中序遍历会按照从小到大的顺序访问二叉树中的节点。
所以,如果一个二叉树是二叉搜索树,那么它的中序遍历结果应该是一个有序的序列。
具体实现时,我们可以使用递归或者迭代的方式进行中序遍历,并将遍历的结果保存在一个数组中。
然后,我们检查这个数组是否是有序的即可判断二叉树是否是二叉搜索树。
2. 问题:给定一个二叉树,如何找到它的最大深度?解答:要找到一个二叉树的最大深度,我们可以使用递归的方式。
对于每个节点,它的最大深度等于其左子树和右子树中的最大深度加1。
递归的终止条件是节点为空,此时深度为0。
具体实现时,我们可以定义一个递归函数,该函数接收一个节点作为参数,并返回以该节点为根节点的子树的最大深度。
在递归函数中,我们先判断节点是否为空,如果为空则返回0;否则,我们分别计算左子树和右子树的最大深度,然后取两者中的较大值加1作为当前节点的最大深度。
3. 问题:给定一个二叉树,如何判断它是否是平衡二叉树?解答:要判断一个二叉树是否是平衡二叉树,我们可以使用递归的方式。
对于每个节点,我们分别计算其左子树和右子树的高度差,如果高度差大于1,则该二叉树不是平衡二叉树。
具体实现时,我们可以定义一个递归函数,该函数接收一个节点作为参数,并返回以该节点为根节点的子树的高度。
在递归函数中,我们先判断节点是否为空,如果为空则返回0;否则,我们分别计算左子树和右子树的高度,然后取两者中的较大值加1作为当前节点的高度。
最后,我们判断左子树和右子树的高度差是否大于1,如果大于1,则该二叉树不是平衡二叉树。
数据结构第七章习题答案

第七章图
1.下面是一个图的邻接表结构,画出此图,并根据此存储结构和深度优先搜索
算法写出从C开始的深度优先搜索序列。
0A13^
1B35^
2C30^
3D4^
4E^
5F4^
【解答】
A B F
C D E
C开始的深度优先搜索序列:CDEABF(唯一的结果)
2.假定要在某县所辖六个镇(含县城)之间修公路,若镇I和镇J之间有可能通
过道路连接,则Wij表示这条路的长度。
要求每个镇都通公路且所修公路总里程
最短,那么应选择哪些线路来修。
I11112233445 J23564546566 W ij1239102626474
(1).画出该图。
(2).用C语言描述该图的数组表示法存储结构,并注明你所使用变量的实际含义。
(3).图示你所定义的数据结构。
(4).标识出你选择的线路。
【解答】
(1)
(2)
#define MAX 6
char vexs[MAX];
出该图的所有强连通分量。
(2).在图中删除弧<2,1>,然后写出从顶点1开始的拓扑有序序列。
【解答】
(1) 共4个强连通分量:
(2) 1,3,2,6,5,4
5 4
6 1 3 2
4
15 10
2
15 20 30 4 10
10。
数据结构第7章2

53 78 47 64 99
3阶B树插入53的过程
1.查找新元素的插入结点q(一定是最下层的非失败结点) 2.(1)若q结点未满 (2)若q结点已满,分裂操作。 (插入新元素后,结点的第m/2个元素)
35
9 24
43 53 78
8
11
27
39
47
64
99
35 53
9 24
43
78
8
11
27
Jul
Sep
Dec
Oct
Nov
将关键码:Aries,Taurus,Gemini, Cancer,Leo,Virgo, Libra,Scorpio,Sagittarius, Capricorn,Acquarius,Pisces 依次插入一棵空的BST,画出最终的BST。
Aries,Taurus,Gemini,Cancer,Leo,Virgo, Libra,Scorpio,Sagittarius,Capricorn,Acquarius,Pisces
55 30 20 40 删除50 60 70 80 95
55 20 30 60 删除40
80 70
95
将关键码:Jan,Feb,Mar,Arp,May,Jun,Jul, Aug, Sep, Oct, Nov, Dec依次插入一棵空的 BST,画出最终的BST。
Jan
Feb
Mar
Apr
Jun
May
Aug
Aries Acquarius Gemini Cancer Capricorn Leo Libra Scorpio Sagittarius Pisces Taurus Virgo
2. m叉搜索树的例子
数据结构第七章课后习题答案 (1)

7_1对于图题7.1(P235)的无向图,给出:(1)表示该图的邻接矩阵。
(2)表示该图的邻接表。
(3)图中每个顶点的度。
解:(1)邻接矩阵:0111000100110010010101110111010100100110010001110(2)邻接表:1:2----3----4----NULL;2: 1----4----5----NULL;3: 1----4----6----NULL;4: 1----2----3----5----6----7----NULL;5: 2----4----7----NULL;6: 3----4----7----NULL;7: 4----5----6----NULL;(3)图中每个顶点的度分别为:3,3,3,6,3,3,3。
7_2对于图题7.1的无向图,给出:(1)从顶点1出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点1出发,按广度优先法搜索法遍历图时所得到的顶点序列。
(1)DFS法:存储结构:本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型L_NODE规定,而各个链表的头指针存放在数组head中。
数组e中的元素e[0],e[1],…..,e[m-1]给出图中的m条边,e中结点形式由类型E_NODE规定。
visit[i]数组用来表示顶点i是否被访问过。
遍历前置visit各元素为0,若顶点i被访问过,则置visit[i]为1.算法分析:首先访问出发顶点v.接着,选择一个与v相邻接且未被访问过的的顶点w访问之,再从w 开始进行深度优先搜索。
每当到达一个其所有相邻接的顶点都被访问过的顶点,就从最后访问的顶点开始,依次退回到尚有邻接顶点未曾访问过的顶点u,并从u开始进行深度优先搜索。
这个过程进行到所有顶点都被访问过,或从任何一个已访问过的顶点出发,再也无法到达未曾访问过的顶点,则搜索过程就结束。
另一方面,先建立一个相应的具有n个顶点,m条边的无向图的邻接表。
数据结构第7章_图_7.1~7.3

( v1 v2 v3 v4 v5 ) v1 邻接矩阵: 0 1 0 1 0 v2 1 0 1 0 1 A.Edge = 0 1 0 1 1 v3 v4 1 0 1 0 1 v5 0 1 1 1 0
数据结构(C语言)
7.2.1 数组(邻接矩阵)表示法
• 课堂练习
– 请对下图的无向带权图,写出它的邻接矩阵
与 v 互为邻接点
有向边(u, v)称为弧,边的始点u叫弧尾,终点v叫弧头 弧头和弧尾: 度、入度和出度: 顶点v的度是与它相关联的边的条数。记作TD(v)。 在有向图中, 顶点的度等于该顶点的入度与出度之和。 顶点v的入度是以 v 为终点的有向边的条数, 记作ID(v); 顶点v的出度是以 v 为始点的有向边的条数, 记作OD(v)。 A B V1 V2
数据结构(C语言)
图的邻接矩阵存储表示举例
#define INFINITY INT_MAX #define MAX_VERTEX_NUM //最大值∞ 20 //假设的最大顶点数
typedef struct{ //图的定义 int vexs[MAX_VERTEX_NUM ] ; //顶点表 int arcs[MAX_VERTEX_NUM ] [MAX_VERTEX_NUM ] ;//邻接矩阵 int vexnum, arcnum;//顶点总数,弧总数 }UDNGraph;
7.1 图的定义和术语
二、相关术语:
有向图: 图G中的每条边都是有方向的。 无向图: 图G中的每条边都是无方向的。 完全图: 图G任意两个顶点都有一条边相连接。
1 2 3 4 (a)一个无向图 0 2 1 3 4 (b) 一个有向图 0
图(a)是一个无向图G1,其顶点集合V(G1)={0,1,2,3,4},边集合 E(G1)={(1,2),(1,3),(1,0),(2,3),(3,0),(2,4),(3,4),(4,0)}。 图2(b)是一个有向图G2,其顶点集合V(G2)={0,1,2,3,4},边集 合E(G2)={<1,2>,<1,3>,<0,1>,<2,3>,<0,3>,<2,4>,<4,3>,<4,0>}。
数据结构总复习+习题+解答

数据结构复习资料
数据结构总复习+习题解答
第一章 绪论
1.1 理解基本概念 1、数据是信息的载体,是描述客观事物的数、字符以及能输入到计算机中,被计算机识别 和处理的符号的集合。 2、数据元素是数据的基本单位,可由若干数据项组成。 3、数据对象是性质相同的数据元素的集合。 4、数据结构指某一数据元素集合中所有数据成员之间的关系,定义为: 数据结构={D,R} 5、数据结构三要素:逻辑结构,物理结构,作用于数据结构的运算。 6、逻辑结构:数据元素间的逻辑关系,分为线性结构和非线性结构(集合、树和图结构) 。 7、物理结构:数据元素及其关系在计算机上的映像,通常按顺序存储或链式存储。 8、抽象数据类型定义了一个数据对象,数据对象中各元素之间的关系以及一组处理数据的 操作。特征:数据抽象和信息隐藏。 9、数据类型和数据结构的异同: 同:它们都具有抽象性,并不特指适用于何处,可根据问题需要用他们来表示数据元 素间的关系。 异:数据结构本身是一种数据的组织和使用形式,通过把数据定义成数据类型才能在 计算机上使用。 1.2 算法特性与性能分析 1、算法的定义:解决特定问题的一系列操作。 2、算法的 5 大特性(要素) :输入、输出、确定性、可行性和有限性。 3、算法时间复杂度分析:寻找关键操作(基本操作,通常为循环的最内层程序段) ,计算关 键操作的执行次数,一般结果为问题规模 n 的多项式。时间复杂度为该多项式的最高次幂。 T(n)=O(1)的含义:常量时间复杂度,表示算法执行时间与问题规模无关。 4、算法空间复杂度分析:算法执行时所需要的辅助空间。 S(n)=O(1)的含义: 常量空间复杂度,表示算法执行时需要的辅助空间与问题规模无关,也 称为算法原地工作。 题 1.1 如何理解抽象数据类型。 答:定义了一个数据对象,数据对象中各元素之间的关系以及一组处理数据的操作。 题 1.2 数据元素间的逻辑结构关系有哪些。 答:四种。分别是集合结构、线性结构、树状结构、图状结构。 题 1.3 通常从时间复杂度和空间复杂度来评价算法的优劣。 题 1.4 下面算法的时间复杂度为(C) int i,j; for(i=0;i<m;i++) for(j=0;j<n;j++) a[i][j]=i*j;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.22③试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。
注意:算法中涉及的图的基本操作必须在此存储结构上实现。
实现下列函数:Status DfsReachable(ALGraph g, int i, int j);/* Judge if it exists a path from vertex 'i' to *//* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/图的邻接表以及相关类型和辅助变量定义如下:Status visited[MAX_VERTEX_NUM];typedef char VertexType;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;} ArcNode;typedef struct VNode {V ertexType data;ArcNode *firstarc;} VNode, AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum;} ALGraph;Status DfsReachable(ALGraph g, int i, int j)/* Judge if it exists a path from vertex 'i' to *//* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/{int k;ArcNode *p;visited[i]=1;for(p=g.vertices[i].firstarc;p;p=p->nextarc){if(p){k=p->adjvex;if(k==j)return 1;if(visited[k]!=1)if(DfsReachable(g,k,j))return 1;}}return 0;}7.23③同7.22题要求。
试基于图的广度优先搜索策略写一算法。
实现下列函数:Status BfsReachable(ALGraph g, int i, int j);/* Determine whether it exists path from vertex i to *//* vertex j in digraph g with Breadth_First Search. *//* Array 'visited' has been initialed to 'false'. */图的邻接表以及相关类型和辅助变量定义如下:Status visited[MAX_VERTEX_NUM];typedef char VertexType;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;} ArcNode;typedef struct VNode {V ertexType data;ArcNode *firstarc;} VNode, AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum;} ALGraph;Status InitQueue(Queue &q);Status EnQueue(Queue &q, int e);Status DeQueue(Queue &q, int &e);Status QueueEmpty(Queue q);Status GetFront(Queue q, int &e);Status BfsReachable(ALGraph g, int i, int j)/* Determine whether it exists path from vertex i to *//* vertex j in digraph g with Breadth_First Search. *//* Array 'visited' has been initialed to 'false'. */{Queue q;int k,n;ArcNode *p;InitQueue(q);EnQueue(q,i);while(!QueueEmpty(q)){DeQueue(q,k);visited[k]=1;for(p=g.vertices[k].firstarc;p;p=p->nextarc){n=p->adjvex;if(n==j)return 1;if(visited[n]!=1)EnQueue(q,n);}}return 0;}7.24③试利用栈的基本操作编写,按深度优先搜索策略遍历一个强连通图的非递归形式的算法。
算法中不规定具体的存储结构,而将图Graph看成是一种抽象的数据类型。
实现下列函数:void Traverse(Graph dig, VertexType v0, void(*visit)(VertexType));/* Travel the digraph 'dig' with Depth_First Search. */图以及相关类型、函数和辅助变量定义如下:Status visited[MAX_VERTEX_NUM];int LocateVex(Graph g, VertexType v);VertexType GetVex(Graph g, int i);int FirstAdjVex(Graph g, int v);int NextAdjVex(Graph g, int v, int w);void visit(char v);Status InitStack(SStack &s);Status Push(SStack &s, SElemType x);Status Pop(SStack &s, SElemType &x);Status StackEmpty(SStack s);Status GetTop(SStack s, SElemType &e);void Traverse(Graph dig, V ertexType v0, void (*visit)(VertexType)){int i,v,flag;SStack s;VertexType p; //flag来记录某点还有没有邻接点InitStack(s);if(dig.vexnum&&dig.arcnum){ i=LocateVex(dig,v0);visited[i]=TRUE;visit(v0);Push(s,v0);while(!StackEmpty(s)){GetTop(s,p);v=LocateVex(dig,p);flag=0;for(i=FirstAdjVex(dig,v);i>=0;i=NextAdjVex(dig,v,i)){ if(!visited[i]) {p=GetVex(dig,i); flag=1; break;}}if(flag){visit(p);visited[i]=TRUE;Push(s,p);}else{Pop(s,p); }}}}7.27④采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。
实现下列函数:Status SinglePath(ALGraph g, VertexType sv, VertexType tv,int k, char *sp);/* Judge whether it exists a path from sv to tv with length k *//* in graph g, return path using string sp if exists. */图的邻接表以及相关类型、函数和辅助变量定义如下:Status visited[MAX_VERTEX_NUM];typedef char StrARR[100][MAX_VERTEX_NUM+1];typedef char VertexType;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;} ArcNode;typedef struct VNode {V ertexType data;ArcNode *firstarc;} VNode, AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum;} ALGraph;int LocateVex(Graph g, VertexType v);void inpath(char *&path, VertexType v);/* Add vertex 'v' to 'path' */void depath(char *&path, VertexType v);/* Remove vertex 'v' from 'path' */Status SinglePath(ALGraph g, VertexType sv, VertexType tv, int k, char *sp) /* Judge whether it exists a path from sv to tv with length k *//* in graph g, return path using string sp if exists. */{ int i,j,l;ArcNode *p;if(sv==tv && k==0){ inpath(sp,tv);return OK; }else{i=LocateVex(g,sv);visited[i]=1;inpath(sp,sv);for(p=g.vertices[i].firstarc;p;p=p->nextarc){l=p->adjvex;if(!visited[l]){if(SinglePath(g,g.vertices[l].data,tv,k-1,sp))return OK;elsedepath(sp,g.vertices[l].data);}}visited[i]=0;}}7.28⑤已知有向图和图中两个顶点u和v,试编写算法求有向图中从u到v的所有简单路径。