数据结构习题课与中期复习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)