- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
习题课与复习典型题讲解
一、解答与应用类
对于下图所示二叉树:完成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++或JAVA语言实现),关键之处请给出简要注释。
(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(ik)? p=p-next; //如果ik,则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或i1而跳出的,而是因为没有找到合法的前驱位置,说明删除位置i不合法。*/
{
printf(删除结点的位置i不合理!);
return ERROR;
}
(2) ;
(3) ;
文档评论(0)