数据结构期末重点复习题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/5/3
12
2、假设用一个循环单链表表示队列,并且只设一个指针rear指 向队尾结点,但不设头指针,设计出相应的队初始化、入队算 法。
Void initQu(Qnode *&rear) {rear=NULL;} Vold EnQu(Qnode *&rear,ElemType x) {Qnode *s; s=(Qnode *)mallaoc(sizeof(Qnode) ); s->data=x; if (rear==NULL) {s->next=s; rear=s;} else {s->next=rear->next; rear->next=s; rear=s} }
L.elem[i]=x; L.length++; }
2020/5/3
3
顺序表算法设计练习:
试写一个算法,实现顺序表的就地逆置, 即利用原表的存储空间将线性表。 (a1,a2,…,an)逆置为(an,an-1,…,a1)。
2020/5/3
4
参考算法:
Void reverse (Sqlist &L) {
2020/5/3
13
作业:
1、设一系列正整数存放在一个数组中,试设计算法,将所 有奇数存放在数组的前半部分,将所有的偶数放在数组的 后半部分。要求尽可能少用临时存储单元并使时间最少。
2、设计一个算法,计算一个三元组表表示的稀疏矩阵的对 角线元素之和。
2020/5/3
14
例:设树T的度为4,其中度为1,2,3和4的结点个数分别 为4,2,1,1 则T中的叶子数为( )
A BC DE F
GH I
先根遍历:ABDEGHICF 后根遍历:DGHIEBFCA
A
B
D
C
EF G
H I
23
6.4.2 森林和二叉树的转换-规则
设森林F={T1,T2,……Tm},二叉树B=(root,LB,RB) (1) 森林转化成二叉树的规则
若F为空(m = 0),B为空; 若F不空(m≠0),B的根root(B)是F中第一棵树T1的根root (T1);
if (exp[i]==‘)’) if (st[top]==‘(’ top--; else tag=0;
if (exp[i]==‘]’) if (st[top]==‘[’ top--; else tag=0;
if (exp[i]==‘}’) if (st[top]==‘{’ top--; else tag=0;
int count=0; for (i=0;i<=L.length-1;i++)
if (L.elem[i]==x) count++;
else L.elem[i-count]=L.elem[i];
}
2020/5/3
7
链表算法设计练习:
设计一个算法删除带头结点的单链表L中值 为x的结点的直接前驱结点。
2020/5/3
8
参考算法:
Int delx(Linklist &L, ElemType x)
{ LinkList p=L, q=p->next, r;
If (q!=Null) r=q->next;
Else return 0;
While (r!=Null && r->data!=x)
{p=q;
q=r;
J
30
二叉树转换成森林
步骤1:抹线-将二叉树根结点与其右孩子连线、沿右分支 搜索到的所有右孩子间连线全部抹掉,使之变成多棵二叉树 步骤2:还原-将孤立的二叉树还原成树
A
B
E
CF G
DH
I J
二叉树B
A
A
E
G
B
E
B
F
H
CF G
C D
I J
DH
I JB
A
EG
C DF H I B转换成的森林F J31
练习:写出下图所示森林的先序和中序遍历序列并 将之转换成一棵二叉树
}
18
例3:按先序序列建立二叉树的二叉链表
已知先序序列:A B C 0 0 D E 0 G 0 0 F 0 0 0 (其中0表示空格字符, 空指针)建立相应的二叉链表
A
B
C
D
E
F
G
19
例:对于前序遍历与中序遍历结果相同的二叉树( F );
对于前序遍历和后序遍历结果相同的二叉树为( B)。
A.一般二叉树 B.只有根结点的二叉树 C.根结点
提示: n0=n2+1
15
例3:已知某二叉树先序序列 { ABHFDECKG } 和中序序列 { HBDFAEKCG }, 画出该二叉树。
A HBDF EKCG
A
B
E
A
A
B
EKCG
B EKCG
H DF
HF
A D
B
E
H F KCG
HF
C
D
D
KG
16
例1:统计二叉树中叶子结点的个数
Status CountLeaf (BiTree T, int & count) { if ( T ) { if ( (T->lchild ==NULL) && (T->rchild ==NULL)) { count + +; return OK; } CountLeaf( T -> lchild, count); // 统计左子树中叶子结点个数 CountLeaf( T -> rchild, count); // 统计右子树中叶子结点个数 } else return ERROR;
}
17
例2:求二叉树的深度
int Depth (BiTree T ) { if ( !T ) depthval = 0; else { depthLeft = Depth( T->lchild ); depthRight= Depth( T->rchild ); depthval = 1 + max(depthLeft,depthRight); } return depthval;
域的个数是:( )
A.不确定
B. 0
C. 1
D. 2 √
左子树为空的二叉树的根结点的左线索为空(无前驱), 先序序列的最后结点的右线索为空(无后继),共2个空 链域
例: 一棵左右子树均不空的二叉树在先序线索化后,其中空
的链域的个数是:( )。
A. 0
B. 1 √
C. 2
D. 不确定
只有最后一个叶结点没有后继
A
A
B
E
B
E
CF G CF G
DH
DH
I
I
J
J
二叉树B
29
二叉树转换成森林
步骤1:抹线-将二叉树根结点与其右孩子连线、沿右分支 搜索到的所有右孩子间连线全部抹掉,使之变成多棵二叉树 步骤2:还原-将孤立的二叉树还原成树
A
A
B
E
B
E
CF G
DH
I J
二叉树B
CF G DH I J
A
E
B
F
C
D
G
H I
A
EG
A EG
B C DF H I B
FH
J
C
I
D
J
森林F
26
森林转换成二叉树
步骤1:转换-将各棵树分别转换成二叉树 步骤2:加线-将每棵树的根结点用线相连 步骤3:旋转-以第一棵树根结点为二叉树的根,再以根结 点为轴心,顺时针旋转,构成二叉树
A
EG
A EG
A
B C DF H I B
FH
B
E
J
C
I CF G
A.5
B.6 C.7
D.8
提示:因为每个结点都有一条枝指向它,分支数为
1*4+2*2+3*1+4*1所有结点数为分支数+1,所以
1*4+2*2+3*1+4*1=4+2+1+1+x x=8
例:若一棵二叉树具有10个度为2的结点,5个度为1的结点,
则度为0的结点个数是( )
A.9
B.11 C.15 D.不确定
21
例: 线索二叉树是一种( )结构。 √
A. 逻辑 B. 逻辑和存储 C. 物理 D.线性
例:n个结点的线索二叉树上含有的线索数为( )
A.2n B.n-1 C.n+1√ D.n
N个结点共有2n个指针域,二叉链表用了n-1个,剩下n+1个
22
练习:写出下图所示树的先序和后序遍历序列并将 之转换成一棵二叉树
{I f (p->data<minp->data) {min=p->data; minp=p; minpre=pre;} pre=p; p=p->next;} minpre->next=minp->next; Free(minp); }
2020/5/3
11
1、假设表达式中允许包含3种括号:圆括号、方括号和大括号。 设计一个算法采用顺序栈判断表达式中的括号是否正确配对。
24
森林转换成二叉树
步骤1:转换-将各棵树分别转换成二叉树 步骤2:加线-将每棵树的根结点用线相连 步骤3:旋转-以第一棵树根结点为二叉树的根,再以根结 点为轴心,顺时针旋转,构成二叉树
A
EG
B C DF H I
J
森林F
AEG
B FH
C
I
D
J
F中每棵树对应的二叉树
25
森林转换成二叉树
步骤1:转换-将各棵树分别转换成二叉树 步骤2:加线-将每棵树的根结点用线相连 步骤3:旋转-以第一棵树根结点为二叉树的根,再以根结 点为轴心,顺时针旋转,构成二叉树
无左孩子的二叉树
D.根结点无右孩子的二叉树
E.所有结点只有左子数的二叉树
F.所有结点只有右子树的二叉树
例:某二叉树的前序序列和后序序列正好相反,则该二叉树
一定是()的二叉树。
A.空或只有一个结点
B.任一结点无左子树
C√.高度等于其结点数
D.任一结点无右子树
20
例: 一棵左子树为空的二叉树在先序线索化后,其中空的链
左子树LB从T1根结点的子树森林 (T11, T12, …, T1m)转换来; 右子树RB是从森林F’={T2, T3, …, Tm} 转换而来。 (2) 二叉树转换为森林的规则 若B为空, F为空; 若B非空,则F中第一棵树T1的根为二叉树的根root(B); T1根的子树森林F1由B的左子树LB转换而来; F 中除 T1 外其余树组成的森林F’={ T2, T3, …, Tn } 由B 的右 子树 RB 转换而来。
Int match (char exp[], int n) {char st[Maxsize]; int top=-1; int i=0,tag=1; while (i<n && tag==1)
{if (exp[i]==‘(’ || exp[i]==‘[‘ || exp[i]==‘{’ ) {top++; st[top]=exp[i];}
D
J
DH
森林F
F转换的二叉树 B
I J27
二叉树转换成森林
步骤1:抹线-将二叉树根结点与其右孩子连线、沿右分支 搜索到的所有右孩子间连线全部抹掉,使之变成多棵二叉树 步骤2:还原-将孤立的二叉树还原成树
A
B
E
CF G
DH
I J
二叉树B
28
二叉树转换成森林
步骤1:抹线-将二叉树根结点与其右孩子连线、沿右分支 搜索到的所有右孩ห้องสมุดไป่ตู้间连线全部抹掉,使之变成多棵二叉树 步骤2:还原-将孤立的二叉树还原成树
参考算法:
Void DelMinNode (Linklist head) {Linklist p=head->next, pre=head; Linklist minp, minpre; Elemtype min=p->data; minp=p;minpre=pre; While (p!=NULL)
A
K
B C I J GH D
EF
先序遍历:ABCDEFIKJGH 中序遍历:BEFDCIAJGHK
作业: 1、简述逻辑结构和存储结构的联系? 2、数据结构和数据类型有什么区别? 3、分析以下算法的时间复杂度
void func(int n) {int i=0,s=0;
while (s<n) {i++; s=s+i; }
}
1
顺序表算法设计练习:
已知一个顺序表L,其中的元素递增有序排 列,设计一个算法插入一个元素x后保持该 顺序表仍递增有序排列。
2020/5/3
2
参考算法:
Void insert (Sqlist &L,ElemType x) {
int i=0, j; if (L.length+1>L.listsize)
p24 while (i<L.length && x>=L.elem[i]) i++; for (j=L.length-1;j>=i; j--) L.elem[j+1]=L.elem[j];
int i=0, j=L.length-1; while (i<j)
{ L.elem[i] <-> L.elem[j]; i++; j--;
} }
2020/5/3
5
顺序表算法设计练习:
试设计一个高效的算法,删除线性表L中所 有值为x的元素。
2020/5/3
6
参考算法:
Void deletelist (Sqlist &L, ElemType x) {
r=r->next;
}
if (r!=Null)
{p->next=q->next;
free(q);}
else return 0;
return 1;
}
2020/5/3
9
链表算法设计练习:
设计一个算法,在带头结点的单链表head中 删除一个data域值最小的结点,假设该结点 唯一。
2020/5/3
10