数据结构应用题整理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、二叉树前序中序遍历(序列与图的相互转化)例题1:
中序序列BDCEAFHG
前序序列ABCDEFGH
例题2
前序序列:ABCDEFGHIJKLMPQRNO
(参考:后序序列:BDEFCAIJKHGQRPMNOL)
中序序列:BDEFCAIJKHGPQRMNOL
2、哈夫曼树
例题1:7,19,2,6,32,3,21,10其对应字母分别为a,b,c,e,f,g,h。
哈夫曼编码:a:0010
b:10
c:00000
d:0001
e:01
f:00001
g:11
h:0011
例题2:w={5, 29, 7, 8, 14, 23, 3, 11}
例题3
例如,设一组电文的字符集D及其概率分布W为:D={a,b,c,d,e},W={0.12,0.40,0.15,0.08,0.25},用哈夫曼算法构造哈夫曼树及其对应的编码如下图所示。
3、最小生成树
Prim算法
4、邻接矩阵(图<->邻接矩阵<->遍历序列(深度、宽度遍历))
5、二分法检索又称为折半查找,采用二分法检索可以大大提高查找效率,它要求线性表结点按其关键字从小到大(或从大到小)按序排列并采用顺序存储结构。
采用二分搜索时,先求位于搜索区间正中的对象的下标mid,用其关键码与给定值x比较:
➢l[mid]. Key = x,搜索成功;
➢l[mid]. Key > x,把搜索区间缩小到表的前半部分,再继续进行对分搜索;
➢l[mid]. Key < x,把搜索区间缩小到表的后半部分,再继续进行对分搜索。
➢
每比较一次,搜索区间缩小一半。如果搜索区间已缩小到一个对象,仍未找到想要搜索的对象,则搜索失败。
例题1:
有一组有序的线性表如下:
(10,14,20,32,45,50,68,90,100,120)
下面分析在其中二分检索关键字20的过程。
下面分析二分检索关键字95的过程:
下面给出二分检索法的非递归与递归实现算法,算法中使用seqlist.h中定义的顺序查找表。
/****************************************************/
/* 二分查找算法文件名:b_search.c */
/* 函数名:binsearch1()、binsearch2() */
/****************************************************/
/*--------二分查找的非递归实现------*/
int binsearch1(seqlist l,datatype key)
{ int low=0,high=l.len-1,mid;
while (low<=high)
{ mid=(low+high)/2; /*二分*/
if (l.data[mid]==key) return mid; /*检索成功返回*/
if (l.data[mid]>key)
high=mid-1; /*继续在前半部分进行二分检索*/
else low=mid+1; /*继续在后半部分进行二分检索*/
}
return -1; /* 当low>high时表示查找区间为空,检索失败*/
}
/*--------二分查找的递归实现------*/
int binsearch2(seqlist l,datatype key,int low,int high)
{ int mid,k;
if (low>high) return -1; /*检索不成功的出口条件*/
else
{ mid=(low+high)/2; /*二分*/
if (l.data[mid]==key) return mid; /*检索成功返回*/
if (l.data[mid]>key)
return
/*递归地在前半部分检索*/
else return /*递归地在后半部分检索*/
} }
例题2 看书218--219页
算法复杂度<=log2(n)+1
6、快速排序写序列
例题1:书p275
例题2:
设待排序的7个记录的排序码序列为{126,272,8,165,123,12,28},一次划分的过程如图所示
最坏情况:
当待排序记录已经"有序"的情况下,排序时间最长。这时,第一次划分经过n-1次比较,将第一个记录定在原位置上;第二次递归调用,经过n-2次比较,将第二个记录定在它原来的位置上,......,这样,总的比较次数为:
C(n) = n (n-1) / 2 =O(n*n);
最好情况:
每次划分所取的枢轴都是当前无序子序列中的"中值"记录,划分的结果是枢轴的左右两个子区的长度大致相等,这时总的比较次数为:C(n) ≤ n + 2C(n/2) ≤ n + 2[n/2+2C(n/22)]
= 2n+4 (n/ 22) ≤ 2n + 4[n/4+2C(n/23 )] = 3n+8 (n/ 23) ≤ ......≤ kn+2k C(n/2k) = nlog2n + nC(1) = O(nlog2n) 可以证明,快速排序的平均时间复杂度是O(nlog2n),它是目前基于比较的内部排序方法中速度最快的一种,快速排序也因此而得名。
7、栈:入栈出栈序列
1、设将整数1、
2、
3、4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下有问题:
(1)若入栈次序为push(1),pop(),push(2),push(3),pop(),pop( ),push(4),pop( ),则出栈的数字序列为什么?
答:1 3 2 4
(2)能否得到出栈序列423和432?并说明为什么不能得到或如何得到。
答:不能得到423。若先1,2,3,4进栈,然后4出栈,此时从栈底到栈顶
为1,2,3,不可能2先出栈,所以423是不可能的出栈序列。
可以得到432。Push(1),push(2),push(3),push(4),pop(4),pop(3),pop(2)即可得到。
(3)请分析1、2、3、4的24种排列中,哪些序列可以通过相应的入出栈得到。
答:
1234。Push(1),pop(1),push(2),pop(2),push(3),pop(3),push(4),pop(4).
1243. Push(1),pop(1),push(2),pop(2),push(3), push(4),pop(4), pop(3)
1432. Push(1),pop(1),push(2),push(3),push(4),pop(4),pop(3),pop(2).
4321. push(1), push(2),push(3),push(4),pop(4),pop(3),pop(2),pop(1).
2134. push(1),push(2),pop(2),pop(1),push(3),pop(3),push(4),pop(4).
2143. push(1),push(2),pop(2),pop(1),push(3),push(4),pop(4),pop(3).