数据结构习题课与中期复习题

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

习题课与复习典型题讲解

一、解答与应用类

1.对于下图所示二叉树:完成1)写出中序遍历序列,并在树上画出(加上)中序遍历线

索;2)将原二叉树转换为森林(8分)

2. 若一报文系统所采用的字符集为{A,B,E,F,S,T},各字符的使用频度分别为:0.19,

0.11, 0.09, 0.25, 0.18, 0.15。拟以这些字符构建一报文系统,要求完成:

1) 画出构造好的Huffman编码树(构造过程可不画,只画最终构造好的的Huffman树;要求:在构造Huffman树的过程中,当用两棵子树构造一棵新树时,根结点权值小者作为左子树);(6分);

2) 画出所构造Huffman树的静态三叉链表存储结构(4分);

3) 写出报文字符集中各字符对应的Huffman编码(4分);

4) 若接收的某报文编码串为:01101011111011001000,请将其翻译成对应的报文原文(2分)。

3.假设一棵二叉树的先序遍历序列为EBADCFHGIKJ,中序遍历序列为ABCDEFGHIJK,画出其对应的二叉树。(举一反三:由输的先根和后根遍历序列,画出其对应的树)

4. 证明任意二叉树度为0的结点个数与度为2的结点个数相差1;

5. 分别画出广义表A=(a, b, (c, d))的两种存储结构图(头尾链表和扩展线性链表);

6. 分析以下程序的复杂度

i=1;

while(i<=n)

i=i*2; //基本语句

7. 已知一个带有表头结点的单链表,结点结构包括两个域,数据域data,指针域link,

假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,

查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data 值,并返回1;否则,只返回0。要求:

(1)描述算法的基本设计思想

(2)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C或C++或JA V A语言实现),关键之处请给出简要注释。

(3)说明你所设计算法的时间复杂度和空间复杂度

答案:

(1)算法基本思想如下:从头至尾遍历单链表,并用指针P指向当前节点的前K个节点。当遍历到链表的最后一个节点时,指针P所指向的节点即为所查找的节点。

(2)算法描述:

Int LocateElement(linklist list,int k)

{ P1=list->link;

P=list;

i=1;

while(P1)

{ P1=P1->link;

i++;

if(i>k) p=p->next; //如果i>k,则p也往后移

}

if(p==list)return 0; //说明链表没有k个结点

else

{

printf(“%d\n“,p->data);

return 1;

}

}

(3)时间复杂度O(n),空间复杂度O(1)

二、算法类习题

1、中序遍历二叉树的递归算法

void InOrder(BiTree root)

//中序遍历二叉树(假设二叉树结点数据元素类型为字符型), root为指向二叉树//(或某一子树)根结点的指针

{

if (root!=NULL)

{

InOrder(root ->LChild); //中序遍历左子树

(1) //访问或输出根结点

(2) //中序遍历右子树

}

}

答案:Visit(root ->data); 或printf("%c ",root ->data);

InOrder(root ->RChild);

2、在带头结点的单链表中,删除一个结点的算法

int DelList(LinkList L,int i,ElemType *e)

/*在带头结点的单链表L中删除第i个元素,并将删除的元素保存到变量*e中*/

{ Node *pre,*r;

int k;

pre=L;

k=0;

while(pre->next!=NULL && k < i-1) /*寻找被删除结点i的前驱结点i-1使p指向它*/

{

(1);

k=k+1;

} /*查找第i-1个结点*/

if(!(pre->next)) /* 即while循环是因为p->next=NULL或i<1而跳出的,而是因为没有找到合法的前驱位置,说明删除位置i不合法。*/

{

printf("删除结点的位置i不合理!");

return ERROR;

}

(2);

(3); /*修改指针,删除结点r*/

(4);

(5);

printf("成功删除结点!");

return OK;

}

答案:

(1)pre=pre->next;

(2)r=pre->next;

(3)pre->next=pre->next->next;

(4)*e = r->data;

(5)free(r);

3、int StrIndex(SString s,int pos, SString t)

/ *求从主串s的下标pos起,串t第一次出现的位置,成功返回位置序号,不成功返回-1* / {

int i,j;

if (t.len==0)

相关文档
最新文档