南邮_数据结构课后习题答案讲解

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

?
?
?1 4 7 ?
?
?
?4 4 9 ?
?4 4 9 ?
4.7 求对题图4-1的稀疏矩阵执行矩阵转置时数组
num[]和k[]的值。
col
0
1
2
3
4
num[col] 1
0
2
1
2
k[col]
0
1
1
3
4
2020/2/8
14
第六章 习题讲解
6-2. 对于三个结点 A,B和C,可分别组成多少不同 的无序树、有序树和二叉树?
int i,j,sum=0;
for (i=0;temp[i]<x&&i<n;i++); //找到首个大于等于 x的元素位置 i
if(i>n-1) return; //没有符合条件的元素
ffoorr ((jj==ii;;ljs<tn[j;]<) =y&&j<n;j++); if (lst[j]>y//)找到首个//大大于于yy的的元元素素前位移置 j
?0 0 ???3 0
6 0
0 0
0? 7??
行三元组:???10
2 0
6 ?列三元组:?1
? 3??
??0
0 2
?3?
6
? ?
? 0 0 0 0 0?
?1 4 7 ?
?3 2 ?8?
? ?
0
0 ? 8 10 0??
??3 2 ?8??
??3
3
10
? ?
?? 0 0 0 0 9??
?3 3 10 ?
(2)void Search_Delete(List *lst, T x,T y)
前置条件: x<y
后置条件:删除有序表中元素值在 x和y之间( 含x和y)的所有元素。
2020/2/8
12
void Search_Delete(List *lst, T x, T y)
{
if (lst->Size==0) { printf(“The list is empty”); return -1; }
解: 第一次比较: M=(1+11)/2=6 ,6<9, 找[7,11]; 第2次比较:M=(7+11)/2=9 , 9=9, 成功。 所以一共比较 2次成功
2020/2/8
25
8-1 建立37,45,91,25,14,76,56,65为输入 时的二叉搜索树,再从该树上依次删除 76,45,则
树形分别如何?
先序:DEHFJGCKAB 中序:HEJFGKCDAB 后序:HJKCGFEBAD
D
E
A
H
F
B
J
G
C K
2020/2/8
19
6-8.设二叉树以二叉链表存储,试编写求解下列问 题的递归算法: (3)求一棵二叉树中的叶结点个数;
int SizeL(BTree Bt) { return SizeofLeaf(Bt.Root); } int SizeofLeaf(BTNode *p) {
} while (i<n);
划线语句的执行次数为 ?log2n? ,渐近时间复杂度为 O(log2n)
2020/2/8
1
(3) for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) for (int k=1;k<=j;k++) x++;
划线语句的执行次数为n(n+1)(n+2)/6 ,渐近时间复杂度为 O(n3)
(4)x=n;y=0; while(x>=(y+1)*(y+1)) y++;
划线语句的执行次数为? n1/2 ? ,渐近时间复杂度为O(n1/2)
2020/2/8
2
第二章 习题讲解
2-4.Loc(A[i][j][k])=134+(i*n*p+j*p+k)*2
2020/2/8
3
2-9. 设有长度为n 的一维整型数组A,设计一个算法,将原数 组中的元素以逆序排列
sum=j-i; lst[i++]=lst[j++]; while(ej<lsne) lst[i++]=lst[j+//+小];于等于//删y的除元su素m删个除元素 n=n-sum; { j++; n--; }
}
2020/2/8
13
4.6 给出下列稀疏矩阵的行优先和列优先顺序存 储的行三元组和列三元组表示。
37
25 14
45 91
76
建成的二叉树
56 65
2020/2/8
26
8-1 建立37,45,91,25,14,76,56,65为输入 时的二叉搜索树,再从该树上依次删除 76,45,则
树形分别如何?
37
25
45
14
91
56
65
删除76后
2020/2/8
27
8-1 建立37,45,91,25,14,76,56,65为输入 时的二叉搜索树,再从该树上依次删除 76,45,则
2020/2/8
7
3-1. 设A,B,C,D,E五个元素依次进栈(进栈 后可立即出栈),问能否得到下列序列。若能得到 ,则给出相应的 push和pop序列;若不能,则说 明理由。 (3)C,A,B,D,E
(3)不能得到该序列,在 C出栈时, A和B在栈中 ,A比B先进栈,所以 B应比A先出栈。
2020/2/8
11直接插入排序直接插入排序33冒泡排序冒泡排序44快速排序快速排序55简单选择排序简单选择排序20202020228841411直接插入排序初始序列61871203087097755326第1趟61871203087097755326第2趟12618703087097755326第3趟03126187087097755326第4趟03081261877097755326第5趟03081261708797755326第6趟03081261708797755326第7趟03081261707587975326第8趟03081253617075879726第9趟0308122653617075879720202020228842423冒泡排序注意冒泡排序只排了7趟初始序列618712030870977553266112030870877553269712030861707553268797030812617053267587970308126153267075879703081253266170758797030812265361707587970308122653617075879720202020228843434快速排序初始序列61871203087097755326532612619775708726125361977570871226536197757087122653619775708712265361877570971226536170758797122653617075879720202020228844445简单选择排序初始序列61871203087097755326038712610870977553260308126187709775532603081261877097755326030812268770977553610308122653709775876103081226536197758770030812265361707587970308122653617075879703081226536170758797202020202288454511114从以下几个方面比较题从以下几个方面比较题111122中各种排序算法中各种排序算法11最好最坏和平均情况下的时间复杂度
2020/2/8
17
6-6. 设对一棵二叉树进行中序遍历和后序遍历的结 果分别为:
(1)中序遍历 (B D C E ) A (F H G ) (2)后序遍历 (D E C B)(H G F) A 画出该二叉树。
A
B
F
C
G
D
E
H
2020/2/8
18
6-7 写出下图中二叉树的先序、中序和后序遍历结果
// 查找首个大于等于 x的元素位置,并记录在 i中
① if (lst->Elements[i]==x) return i; //x在表中时,返回 x的位置
② if (IsFull(lst)) //或if(lst->Size==lst->maxList) return -1; //表已满时,无法插入,返回 -1
(1)无序树: 9棵
3棵
6棵
(2)有序树: 12棵
6棵
6棵
(3)二叉树: 30棵
各6棵
2020/2/8
15
6-3. 设在度为 m的树中,度为 1,2,…,m的节点 个数分别为 n1,n2,…,nm,求叶子节点的数目。
设度为0的节点个数为 n0则: 树的总度数 =节点总个数 -1 即:1*n1+2*n2+…+m*nm =n0+ n1+n2+n3+….+ nm-1 因此叶子节点数目为: n0=n2+2*n3+….+ (m -1)nm+1
}
2020/2/8
4
2-12.设计一个算法,将单链表中结点以逆序排列。逆序的 单链表中的结点均为原表中的结点。 Node* pInvert(Node* first) { Node *p=first, *q; first=NULL; while (p) { q=p->Link; p->Link=first; first=p; p=q; } return first; }
2020/2/8
16
6-5. 找出所有二叉树,其节点在下列两种次序下 恰好都以同样的次序出现: (1)先序和中序;( 2)先序和后序;( 3)中 序和后序
(1)或者为空二叉树,或者所有结点的左子树都 是空的单支树 (2)或者为空二叉树,或者只有根结点的二叉树 (3)或者为空二叉树,或者所有结点的右子树都 是空的单支树
?否则,若表未满,则在表中插入新元素 x,并且插 入后,线性表仍然是有序的, 返回新元素 x的位置;
?若表已满,无法插入新元素,则 返回-1。
2020/2/8
10
int Search_Insert(List *lst, T x)
{ int i,j;
for(i=0; (x>lst->Elements[i])&&(i<lst->Size) ;i++);
if(!p) return 0;
if( (!(p->RChild))&&(!(p->LChild)) ) return 1;
return SizeofLeaf(p->LChild)+SizeofLeaf(p->RChild); }
2020/2/8
20
(4)设计算法,交换一棵二叉树E五个元素依次进栈(进栈 后可立即出栈),问能否得到下列序列。若能得到 ,则给出相应的 push和pop序列;若不能,则说 明理由。 (4)E,D,C,B,A
(4)能得到该序列。 相应的push和pop序列为:push(A); push(B); push(C); push(D); push(E); pop(); pop(); pop(); pop(); pop();
2020/2/8
5
第三章 习题讲解
3-1. 设A,B,C,D,E五个元素依次进栈(进栈 后可立即出栈),问能否得到下列序列。若能得 到,则给出相应的 push和pop序列;若不能,则 说明理由。 (1)A,B,C,D,E
(1)能得到该序列。 相应的push和pop序列为:push(A); pop(); push(B); pop(); push(C); pop(); push(D); pop(); push(E); pop();
for (j=lst->Size-1; j>=i; j--)
lst->Element[j+1]=lst->Element[j];
③ lst->Element[i]=x; //新元素即插入位置 i处
lst.Size++;
return i;
//插入新元素并返回该元素的位置
}
2020/2/8
11
4-1. 设线性表采用顺序表示方式,并假定顺序表是 有序的(设 表中元素已按非递减次序排列 )。编写 函数,实现线性表的如下运算:
2020/2/8
9
第四章 习题讲解
4-1. 设线性表采用顺序表示方式,并假定顺序表是 有序的(设 表中元素已按非递减次序排列 )。编写 函数,实现线性表的如下运算:
(1)int Search_Insert(List *lst,T x)
后置条件:在有序的顺序表中搜索元素 x。
?若x在表中,则 返回x在表中的位置 。
void ExchBt(BTree Bt)
{
Exch(Bt.Root); }
void Exch(BTNode *p)
{
if (p)
{
BTNode *q=p->LChild;
p->LChild=p->RChild;
p->RChild=q;
Exch(p->LChild);
Exch(p->RChild);
2020/2/8
6
第三章 习题讲解
3-1. 设A,B,C,D,E五个元素依次进栈(进栈 后可立即出栈),问能否得到下列序列。若能得 到,则给出相应的 push和pop序列;若不能,则 说明理由。 (2)A,C,E,B,D
(2)不能得到该序列,在 E出栈时, B和D在栈 中,B比D先进栈,所以 D应比B先出栈。
A: 1010 B: 1011 C: 100 D: 00 E: 01 F: 11
加权路径长度:WPL=(2+3)×4+5×3+(7+9+12)×2=91
2020/2/8
23
7-4为什么说对半搜索算法只适用于顺序有序表的 情况?为什么说顺序搜索可用于顺序表和链表, 也不受表的有序性限制?
解: 1、 对半搜索 算法必须针对顺序存储的有序表,要 求满足两个条件:
1)顺序存储,只有顺序存储才可以根据元素下 标(地址)随机存取元素;
2)有序存储,只有有序存储才可以其实现对半 查找。 2、 顺序搜索 从头到尾逐个查找,所以可用于顺序 表和链表,也不受表的有序性限制。
2020/2/8
24
补充:已知( 1,2,3,4,5,6,7,8,9,10 ,11)找到 9比较几次?
第一章 习题讲解
1-19.确定下列各程序段的程序步,确定划线语句的执行次 数,计算它们的渐近时间复杂度。 (1) i=1; k=0;
do { k=k+10*i; i++;
} while(i<=n-1) 划线语句的执行次数为 n-1 ,渐近时间复杂度为O(n)
(2)i=1; x=0;
do{
x++; i=2*i;
void Invert(T elements[], int length) //length数组长度 //elements[]为需要逆序的数组
相关文档
最新文档