北邮算法与数据结构习题参考答案
北邮算法与数据结构习题参考标准答案

}
}
四、判断括号是否配对:
intCorrect( strings )
{
Inistack(Q);
for(i=0;s[i]== ‘=’;i++ )//表达式以‘=’结束
{
switch(s[i] )
=2n–1
所以,梵塔的移动次数为2n–1次。
三、简化的背包问题:
void Pack( intm, int i,int t)//初始值为:11t
{
for (k=i; k<=n;k++)
{
solution[m]=weight[k];
if( t == weight[k])
{
for ( j=1;j<=m;j++) cout<<solution[j];cout<<endl;
{
C=new struct node;C->next=NULL;q=B->next;
While(q)
{
p=A->r= new struct node;r->exp= p->exp+q->exp;
r->inf=p->inf* q->inf;PolyAdd(C,r);
p=p->next;
void Insert (string S, string T, charch)//设块大小为m
{
i=0; p=T;
while ((p->next)&&(!i))
{
for(j=1;j<=m;j++ ) if(p->str[j]==ch) i=j;
北邮算法与数据结构习题参考答案

北邮算法与数据结构习题参考答案作业参考答案一、(带头结点)多项式乘法 C = A×B:void PolyAdd ( list &C, list R) // R 为单个结点{p=C;while ((!p->next) && (p->next->exp>R->exp)) p=p->next; if ((p->next) || (p->next->exp<R->exp)){ R->next=p->next; p->next=R; } else{ p->next->inf += R->inf; delete R;if ( ! p->next->inf ){ R=p->next; p->next=R->next; delete R; } }}void PolyMul ( list A, list B, list &C ){C=new struct node; C->next=NULL; q=B->next; While ( q ){p=A->next;while ( p ){r = new struct node; r->exp = p->exp + q->exp;r->inf = p-> inf * q->inf; PolyAdd(C, r);p=p->next;}q=q->next;}}二、梵塔的移动次数:已知移动次数迭代公式为:M ( n ) = 2M ( n-1 ) + 1初值为:M ( 0 ) = 0则:M ( n ) = 2 ( 2M ( n-2 ) + 1 ) + 1= 4M ( n-2 ) + 3= 8M ( n-3 ) + 7= 2i M ( n-i ) + 2i– 1若n=i ,则M ( n-n ) = 0,故:M ( n ) = 2n M ( n-n ) + 2n– 1= 2n– 1所以,梵塔的移动次数为2n– 1次。
北邮数据结构第六章答案详解 图(1)

1
5
1
54 3
42
5 66
图 6-8 图 G 答案:根据不同算法构造的最小生成树如图 6-9 所示的图(a)和(b)
2
④
⑤ 5
1
①
4 3
②
③
6
2
⑤
③ 5
1
①
4 3
④
②
6
(a) Prim 生成树
(b) Kruskal 生成树
图 6-9 最小生成树
5、算法设计
(1)以邻接表为存储结构,设计实现深度优先遍历的非递归算法。
int top = -1; cout<<v<<’\t’; bVisited[v] = true; stack[++top] = v;
//访问结点 v //设置访问标记 //结点 v 入栈
while (top!=-1)
{
v=stack[top];
ArcNode<T> *p = adjlist[v]. firstarc; ①
)
A.1
B. n/2
C.n-1
D.n
解析:若超过 n-1,则路径中必存在重复的顶点
答案:C
(5) 若一个图中包含有 k 个连通分量,若按照深度优先搜索的方法访问所有顶点,则必
须调用(
)次深度优先搜索遍历的算法。
A.k
B.1
C.k-1
D.k+1
解析:一次深度优先搜索可以访问一个连通分量中的所有结点,因此 k 个连通分量需要 调用 k 次深度优先遍历算法。
④
} if (p==NULL) top--;
⑤//若是找不到未访问的结点,出栈
2022年北京邮电大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年北京邮电大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、无向图G=(V,E),其中:V={a,b,c,d,e,f},E={(a,b),(a, e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该图进行深度优先遍历,得到的顶点序列正确的是()。
A.a,b,e,c,d,fB.a,c,f,e,b,dC.a,e,b,c,f, dD.a,e,d,f,c,b2、设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储, a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为()。
A.13B.33C.18D.403、某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。
A.单链表B.仅有头指针的单循环链表C.双链表D.仅有尾指针的单循环链表4、最大容量为n的循环队列,队尾指针是rear,队头:front,则队空的条件是()。
A.(rear+1)MOD n=frontB.rear=frontC.rear+1=frontD.(rear-1)MOD n=front5、下列关于AOE网的叙述中,不正确的是()。
A.关键活动不按期完成就会影响整个工程的完成时间B.任何一个关键活动提前完成,那么整个工程将会提前完成C.所有的关键活动提前完成,那么整个工程将会提前完成D.某些关键活动若提前完成,那么整个工程将会提前完成6、下列关于无向连通图特性的叙述中,正确的是()。
Ⅰ.所有的顶点的度之和为偶数Ⅱ.边数大于顶点个数减1 Ⅲ.至少有一个顶点的度为1A.只有Ⅰ B.只有Ⅱ C.Ⅰ和Ⅱ D.Ⅰ和Ⅲ7、若一棵二叉树的前序遍历序列为a,e,b,d,c,后序遍历序列为b, c,d,e,a,则根结点的孩子结点()。
A.只有e B.有e、b C.有e、c D.无法确定8、一棵哈夫曼树共有215个结点,对其进行哈夫曼编码,共能得到()个不同的码字。
算法与数据结构习题及参考答案

算法与数据结构习题及参考答案一、选择题1. 在算法分析中,时间复杂度表示的是:A. 算法执行的时间B. 算法的运行速度C. 算法执行所需的操作次数D. 算法的内存消耗答案:C2. 哪种数据结构可以在常数时间内完成插入和删除操作?A. 数组B. 栈C. 队列D. 链表答案:B3. 单链表的逆置可以使用哪种算法实现?A. 冒泡排序B. 归并排序C. 快速排序D. 双指针法答案:D4. 常用的查找算法中,哪种算法的时间复杂度始终为O(log n)?A. 顺序查找B. 二分查找C. 广度优先搜索D. 深度优先搜索答案:B5. 哪种排序算法的时间复杂度最坏情况下仍为O(n log n)?A. 冒泡排序B. 插入排序C. 快速排序D. 堆排序答案:C二、填空题1. 下面哪个数据结构先进先出?A. 栈B. 队列C. 堆D. 链表答案:B2. 在快速排序的基本步骤中,需要选取一个元素作为________。
答案:枢纽元素3. 广度优先搜索使用的数据结构是________。
答案:队列4. 二分查找是基于_________的。
答案:有序数组5. 哈希表的查找时间复杂度为_________。
答案:O(1)三、解答题1. 请简要说明冒泡排序算法的原理及时间复杂度。
答:冒泡排序是一种简单直观的排序算法。
它的基本思想是通过相邻元素之间的比较和交换来将最大(或最小)的元素逐渐“冒泡”到数列的一端。
冒泡排序的过程如下:1)比较相邻的元素,如果前面的元素大于后面的元素,则交换它们的位置;2)对每一对相邻元素重复进行比较和交换,直到最后一对元素;3)针对剩下的元素重复上述步骤,直到整个数列有序。
冒泡排序的时间复杂度为O(n^2),其中n为待排序数列的长度。
在最坏情况下,冒泡排序需要进行n-1次比较和交换操作,因此时间复杂度为O(n^2)。
在最好情况下,如果待排序数列已经有序,冒泡排序只需进行n-1次比较,没有交换操作,时间复杂度为O(n)。
(完整word)北邮C++数据结构课后习题 习题4参考答案

习题41.填空题(1)已知二叉树中叶子数为50,仅有一个孩子的结点数为30,则总结点数为(___________)。
答案:129(2)4个结点可构成(___________)棵不同形态的二叉树。
答案:12(3)设树的度为5,其中度为1~5的结点数分别为6、5、4、3、2个,则该树共有(___________)个叶子。
答案:31(4)在结点个数为n(n〉1)的各棵普通树中,高度最小的树的高度是(___________),它有(___________)个叶子结点,(___________)个分支结点。
高度最大的树的高度是(___________),它有(___________)个叶子结点,(___________)个分支结点。
答案:2 n—1 1 n 1 n-1(5)深度为k的二叉树,至多有(___________)个结点。
答案:2k-1(6)有n个结点并且其高度为n的二叉树的数目是(___________)。
答案:2n—1(7)设只包含根结点的二叉树的高度为1,则高度为k的二叉树的最大结点数为(___________),最小结点数为(___________)。
答案:2k-1 k(8)将一棵有100个结点的完全二叉树按层编号,则编号为49的结点为X,其双亲PARENT(X)的编号为().答案:24(9)已知一棵完全二叉树中共有768个结点,则该树中共有(___________)个叶子结点。
答案:384(10)已知一棵完全二叉树的第8层有8个结点,则其叶子结点数是(___________).答案:68(11)深度为8(根的层次号为1)的满二叉树有(___________)个叶子结点。
答案:128(12)一棵二叉树的前序遍历是FCABED,中序遍历是ACBFED,则后序遍历是(___________).答案:ABCDEF(13)某二叉树结点的中序遍历序列为ABCDEFG,后序遍历序列为BDCAFGE,则该二叉树结点的前序遍历序列为(___________),该二叉树对应的树林包括(___________)棵树。
北邮数据结构与算法课后答案 第7章

于 n/2 则在后半区间继续查找。
int fun (Stable *L, int low, int high)
/*以第一个元素为基准分割下标在区间[low, high]内的元素序列*/
{L->elem[0]=L->elem[low] ;
K=L->elem[0].key;
while(low<high)
第7章
1.选择题
(1)A (2)C (3)C (4)D (5)D (6)C (7)B (8)C (9)D (10)C
2.判断题
(1)√ (2)Ⅹ (3)√ (4)Ⅹ (5)Ⅹ (6)√ (7)Ⅹ (8)√ (9)√ (10)√
3.简答题
(1)以关键字序列(tim,kay,eva,roy,dot,jon,kim,ann,tom,jim,guy,amy)为例,手工执行以下排序算法
j++;
}
} 4.已知记录序列 a[1..n]中的关键字各不相同,可按如下所述实现计数排序:另设数组 c[1..n],对每个 记录 a[i],统计序列中关键字比它小的记录个数存于 c[i],则 c[i]=0 的记录必为关键字最小的记录,然后依 c[i]值的大小对 a 中记录进行重新排列,试编写实现上述排序的算法。
{if (max=i) {w=r[min];r[min]=r[n-i+1];r[N-i+1]=w;} else {w=r[max];r[max]=r[n-i+1];r[N-i+1]=w;}
} i++; } } 【解答】这是一个双向选择排序算法,每次选择关键码最小的记录放在前面,同时选择关键码最大的记录 放在后面。比较 n*(n-1)/2 次。最好情况移动记录 0 次,最坏情况大约移动记录 3n 次。 (6)请回答以下关于堆的问题: 1)堆的存储结构是顺序的,还是链式的? 2)设有一个大顶堆,即堆中任意结点的关键码均大于它的左孩子和右孩子的关键码。其具有最大 值的元素可能在什么地方? 3)对 n 个元素进行初始建堆的过程中,最多做多少次数据比较? 【解答】1)堆的存储结构是顺序的。 2)堆顶。 3)不超过 4n。
北邮数据结构与算法课后答案第7章

北邮数据结构与算法课后答案第7章第7章1.选择题(1)A (2)C (3)C (4)D (5)D (6)C (7)B (8)C (9)D (10)C2.判断题(1)√ (2)Ⅹ (3)√ (4)Ⅹ (5)Ⅹ (6)√ (7)Ⅹ (8)√ (9)√ (10)√3.简答题(1)以关键字序列(tim,kay,eva,roy,dot,jon,kim,ann,tom,jim,guy,amy)为例,手工执行以下排序算法(按字典序比较关键字的大小),写出每一趟排序结束时的关键字状态:1)直接插入排序;2)冒泡排序;3)直接选择排序;4)快速排序;5)归并排序;6)基数排序。
【解答】略。
(2)已知序列{50,18,12,61,8,17,87,25},请给出采用堆排序对该序列做升序排序时的每一趟结果。
【解答】堆排序过程如下图示:1887 12178255061618712178185025(3)有n个不同的英文单词,它们的长度相等,均为m,若n>>50,m<5,试问采用什么排序方法时间复杂度最小?为什么?【提示】采用基数排序。
基数排序是一种借助多关键码排序思想对单关键码进行排序的方法,它适合n很大,而关键码较小的序列。
本题中英文单词数目n>>50,而单词长度m<5,因此采用基数排序方法最佳。
(4)如果只想得到一个含有n个元素的序列中第k(k<<n)小元素之前的部分排序序列,最好采用什么排序方法?为什么?如有这样一个序列:{57,11,25,36,18,80,22}得到其第3个最小元素之前的部分序列{11,18,22},使用所选择的算法实现时,要执行多少次比较?< p="">【解答】采用堆排序。
简单选择排序和冒泡排序可以在一趟排序后选出一个最大(或最小)元素,要比较n-1次,选次大元素要再比较n-2次,…其时间复杂度是O(n2)。
当k<<n时,从n个元素中选k 个元素不能使用这种方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业参考答案一、(带头结点)多项式乘法 C = A×B:void PolyAdd ( list &C, list R) // R 为单个结点{p=C;while ((!p->next) && (p->next->exp>R->exp)) p=p->next; if ((p->next) || (p->next->exp<R->exp)){ R->next=p->next; p->next=R; } else{ p->next->inf += R->inf; delete R;if ( ! p->next->inf ){ R=p->next; p->next=R->next; delete R; }}}void PolyMul ( list A, list B, list &C ){C=new struct node; C->next=NULL; q=B->next;While ( q ){p=A->next;while ( p ){r = new struct node; r->exp = p->exp + q->exp;r->inf = p-> inf * q->inf; PolyAdd(C, r);p=p->next;}q=q->next;}}二、梵塔的移动次数:已知移动次数迭代公式为: M ( n ) = 2M ( n-1 ) + 1初值为: M ( 0 ) = 0则: M ( n ) = 2 ( 2M ( n-2 ) + 1 ) + 1 = 4M ( n-2 ) + 3= 8M ( n-3 ) + 7= 2i M ( n-i ) + 2i– 1若n=i ,则M ( n-n ) = 0,故:M ( n ) = 2n M ( n-n ) + 2n– 1 = 2n– 1所以,梵塔的移动次数为2n– 1次。
三、简化的背包问题:void Pack ( int m, int i, int t ) // 初始值为: 1 1 t {for ( k=i; k<=n; k++ ){solution[m] = weight[k];if ( t == weight[k] ){for ( j=1; j<=m; j++ ) cout<<solution[j]; cout<<endl;} else if ( t > weight[k] ) Pack ( m+1, k+1, t - weight[k] );}}四、判断括号是否配对:int Correct ( string s ){Inistack(Q);for ( i=0; s[i] == ‘=’; i++ ) // 表达式以‘=’结束{switch ( s[i] ){case ‘(’:case ‘[’:case ‘{’:Push ( Q, s[ i ] ); break;case ‘)’:case ‘]’:case ‘}’:if ( Empty(Q)) return 0; t=Pop(Q);if ( ! Matching( t, s[i] )) return 0;}}if ( ! Empty(Q) ) return 0;return 1;}五、堆栈可能的输出:12341243 1324 1342 1423 143221342143 2314 2341 2413 24313124 3142 3214 3241 3412 342141234132 42134231 4312 4321六、用两个堆栈实现一个队列:int FullQ ( ){if (Full (S1) && ! Empty (S2)) return 1; return 0; }int EmptyQ ( ){if ( Empty (S1) && Empty (S2)) return 1; return 0;}void Enqueue ( elemtype x){if (Full(S1)) if (Empty(S2)) while (! Empty (S1)) Push(S2, Pop(S1));if (! Full(S1)) Push(S1, x);}elemtype Dequeue ( ){if (Empty(S2)) while (! Empty(S1)) Push(S2, Pop(S1));if (! Empty(S2)) return Pop(S2);}七、生成新串及字符第一次出现位置:int Index ( string S, string T ){for ( i=1; i + Len(T)-1<=Len(S); i++ )if Equal ( Sub ( S, I, Len (T)), T ) return i;return 0;}void CreatNewStr ( string S, string T, string R, arrant P){R=“”; j=0;for ( i=1; i<=Len(S); i++ ){ch=Sub( S, i, 1 );if ( ! Index(T, ch) && ! Index(R, ch) ){ R=Concat(R, ch); P[j++]=i; }}}八、块链字符串插入:{为避免字符串部块间大量的数据移动,最好的方法是定义两种字符串中不出现的字符作为空标记和串结束标记,如‘#’和‘$’;也可只使用空标记,串结束以块尾指针为空表示,其算法如下:void Insert ( string S, string T, char ch) // 设块大小为m{i=0; p=T;while ((p->next) && (! i)){for ( j=1; j<=m; j++ ) if (p->str[j]==ch) i=j;if (! i) p=p->next;}if (! i) for ( j=1; j<=m; j++ ) if (p->str[j]==ch) i=j;if (! i) p->next=S; else // S插在T后{ // ch所在结点分裂,S插在T中分裂的两结点间q= new struct node; q->str=p->str; q->next=p->next;for ( j=i; j<=m; j++ ) p->str[j]= ‘#’; p->next=S;for ( j=1; j<i; j++ ) q->str[j]= ‘#’; p=S;while ( p->next ) p=p->next; p->next=q;}}九、上三角矩阵的存储:k= (i-1)*n+j-i*(i-1)/2=(2n-i+1)*i/2+j-nf1=(2n-i+1)*i/2f2=jc=-n十、循环右移k位:1 2 3 4 5 6 7 8 (n=8, k=3)67 8 1 2 3 4 587 6 5 4 3 2 1void Exch ( arrtype A, int st, int ed ){for ( i=st; i<=(st+ed) / 2; i++ ) A[i]←→A[ed-i+1];}void Shift ( arrtype A, int k, int n ){Exch(A, 1, n);Exch(A, 1, k);Exch(A, k+1, n)}十一、广义表运算结果:1、(a,b)2、((c,d))3、(c,d)4、(b)5、b6、(d)十二、利用广义表运算取出c 原子:1、Head(Tail(Tail(L1)))2、Head(Head(Tail(L2)))3、Head(Head(Tail(Tail(Head(L3)))))4、Head(Head(Head(Tail(Tail(L4)))))5、Head(Head(Tail(Tail(L5))))6、Head(Tail(Head(L6)))7、Head(Head(Tail(Head(Tail(L7)))))8、Head(Head(Tail(Head(Tail(L8)))))十三、满k 叉树问题:1、k n-12、n=1无父结点,否则为3、(n-1)k+1+i4、(n-1) Mod k ≠0十四、叶子结点数目:n 0=∑(i-1)n i +1十五、找最近共同祖先:bitptr Forefather ( bitptr root, bitptr p, bitptr q ) {find = 0; // 0---p 、q 都未找到; >0---找到一个; -1---都找到了INIT ( ff ); {定义一个数组 ff 用于记录查找路径}Fff ( root, p, q, 0, ft );return ft;}n-2+k k i=1 mvoid Fff (bitptr root, bitptr p, bitptr q, int m, bitptr &ft){if ( root && ( find >= 0 )){m = m+1;if ((root==p) || (root==q)) if (! find) find = m-1; else{ft = ff [ find ];find = -1;}ff [m] = root;Fff ( root->lc, p, q, m, ft );Fff ( root->rc, p, q, m, ft );if (m==find) find = m-1;}}十六、求树的直径等:void High ( bitptr t, int *hi, Arrtype path ){*hi = 0;INIT ( p ); {定义数组 p 动态存储路径}Hhh ( t, 1, hi, path);}void Hhh( bitptr t, int level, int *hi, Arrtype path ){if ( t ){p [ level ] = t->data;if ( ! t->lc && ! t->rc ) if ( level>hi ) {hi = level;for (i=1 ; i<=level ; i++) path[i] = p[i];}Hhh ( t->lc, level+1, hi, path );Hhh ( t->rc, level+1, hi, path );}}十七、输出中缀表达式并加上括号:void Expout ( tree t ){if ( ! t ){if ( t->lchild)if ((( t->lchild->data==‘+’)||(t->lchild->data== ‘-’)) && (( t ->data==‘*’)||(t->data==‘/’))){cout<<‘(’; Expout ( t->lchild ); cout<<‘)’;} else Expout ( t->lchild );cout<<t->data );if (t->rchild)if (( t->data==‘*’)||(t->data==‘/’)){cout<<‘(’; Expout ( t->rchild ); cout<<‘)’;} else Expout ( t->rchild );}}十八、建立二叉树:void Creat_bintree ( bitptr &t, int i, string s ){ // i 为输入字符串的当前指针,初值为 1 }if (s[i]==’#’){t = NULL;i++;} else{t = new struct node;t->data = s[i];i++;if (( i >Length(s)) || (s[i]!= ‘(’ )){t->lc = t->rc = NULL;return;}i++; {去左括号}Creat_bintree ( t->lc, i, s); {建左子树}i++; {去逗号}Creat_bintree ( t->rc, i, s); {建右子树}i++; {去右括号}}}十九、按凹入表方式打印树:void Print_tree ( bitptr t ){Prt ( t, 1)}void Prt ( bitptr t, int level ){if ( t ){Prt ( t->rc, level+1);for ( int i=1 ; i<=level ; i++ ) cout << ‘’; cout << t->data;Prt ( t->lc, level);}}二十、判断是否存在长度为 k 的简单路经:void SearchPath ( int v, int vt, int k, int m ){ //存储结构可选用邻接矩阵,路径从vs出发,到vt结束,长度为kvisited[v] = TRUE;P[m] = v;if ( v==vt ){if ( m == k+1 ){for ( i =1 ; i <= m ; i++ ) cout << P[i];cout << endl;}} else{w = FirstAdj ( v );while ( w ){if ( ! visited[w] ) SearchPath(w, vt, k, m+1);w = NextAdj ( v, w );}}visited[v] = FALSE;}二十一、求所有简单回路:void SearchCycle ( int v, int m ){ // 存储结构可选用邻接矩阵visited[v] = TRUE;P[m] = v;w = FirstAdj ( v );while ( w ){if ( ! visited[w] ) SearchCycle(w, m+1); else{for ( j = 1 ; P[j]==w ; j++);for ( i =j ; i <= m ; i++ ) cout << P[i];cout << w << endl;}w = NextAdj ( v, w );}visited[v] = FALSE;}二十二、求最小代价生成树:1、 0 2 3 ∞ ∞ ∞ ∞ ∞ 2 0 ∞2∞ ∞∞ ∞3 ∞ 0 1 ∞ ∞ ∞ ∞ ∞ 2 1 0 24 ∞ ∞∞ ∞ ∞ 2 0 1 2 ∞∞ ∞ ∞ 4 1 0 2 1∞ ∞ ∞ ∞ 2 2 0 3∞ ∞ ∞ ∞ ∞ 1 3 02、二十三、求关键路经和最短路经:1、 a b c d e f g h ive:0 2 3 611 1013 1417 vl: 0 4 3 611 10 13 15 2 2 1 1 2 2 1 117关键路经为:a c d f e g i2、a →b c d e f g h i2(ab) 3(ac) ∞ ∞ ∞ ∞ ∞ ∞3(ac) 4(abd) ∞ ∞ ∞ ∞ ∞4(abd) ∞ ∞ ∞ ∞ ∞7(abde) 8(abdf) ∞ ∞ ∞8(abdf) 9(abdeg) ∞∞ 9(abdeg) 9(abdfh)∞9(abdfh)13(abdegi)11(abdfhi)二十四、边界标识法:1、2、二十五、按访问频度查找:list Search ( list H, keytype K )avav{p = H;q = NULL;while ( p->next && ! q ){if (p->next->key == K){q = p->next;q->freq++;while ((H!=p) && (H->next->freq>=q->freq)) H = H->next;if (H!=p){p->next = q->next;q->next = H->next;H->next = q;}}p = p->next;}return q;}二十六、判断是否二叉排序树:int BST ( bitptr t, bitptr &p ){if ( ! t ) return 1;L = BST ( t->lc , p );D = 1;if ( p && p->data > t->data) else D = 0;p = t;R = BST ( t->rc , p );return L && D && R;}int BinarySortTree ( bitptr t ){p=NULL;return BST ( t , p );}二十七、建立 2-3 树:插入20 插入30 插入50插入52 插入60 插入68插入70 删除50 删除68二十八、散列表:(1):0 1 2 34 5 6 7 8 9 10 11 12 13 14 15 161+2+1+1+1+1+2+4+5+2+5+6 31ASL成功 = —————————————— = ——12 125+4+3+2+1+9+8+7+6+5+4+3+2+1 30ASL不成功 = ———————————————— = ——14 7(2):Aug Jun May NovJul1+2+1+1+1+2+3+1+2+1+2+1 9ASL成功 = —————————————— = ——12 63+1+2+2+1+4+3+3+1+2+1+1+1+1 13ASL不成功 = ———————————————— = ——14 7ASL不成功 = 12/14 (与空指针比较次数不算)?二十九、证明快速排序退化时的时间复杂度:当待排序列有序时,有 T ( n ) = T ( n – 1 ) + n – 1= T ( n – 2 ) + 2 * n – 3= T ( n – 3 ) + 3 * n – 6…= T ( n – i ) + i * n – i * ( i+ 1 ) / 2…= T ( n – n ) + n * n – n * ( n + 1 ) / 2= n * ( n – 1 ) / 2故,此时快速排序的时间复杂度为O ( n 2 )。