版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
答案:ABCDE=2,1,1,38、设森林F中有三棵树,第一、第二和第三棵树的结点个数分别为M1、M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是(D)A)M1B)M1+M2C)M3D)M2+M3将一棵有100个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根结点编号为1,则编号最大的非叶结点的编号为(C)A、48B、49C、50D、51某二叉树结点的中序序列为A、B、C、D、E、F、G,后序序列为B、D、C、A、F、G、E,则其左子树中结点数目为(C)A)3B)2C)4D)5四、简答题(每小题4分,共20分)1.一棵度为2的树与一棵二叉树有何区别?答:度为2的树从形式上看与二叉树很相似,但它的子树是无序的,而二叉树是有序的。即,在一般树中若某结点只有一个孩子,就无需区分其左右次序,而在二叉树中即使是一个孩子也有左右之分。2.设如下图所示的二叉树B的存储结构为二叉链表,root为根指针,结点结构为:(lchild,data,rchild)。其中lchild,rchild分别为指向C的结点类型定义如下:左右孩子的指针,data为字符型,root为根指针,试回答structnode下列问题: {chardata;structnode*lchild,rchild;对下列二叉树B,执行下列算法traversal(root),试指};出其输出结果; 假定二叉树B共有n个结点,试分析算法traversal(root)C算法如下:的时间复杂度。(共8分) voidtraversal(structnode*root){if(root)ABABDCFGEtraversal(root->lchild);printf(“%c”,root->data);二叉树Btraversal(root->rchild);}}解:这是“先根再左再根再右”,比前序遍历多打印各结点一次,输出结果为:ABCCEEBADFFDGG特点:①每个结点肯定都会被打印两次;②但出现的顺序不同,其规律是:凡是有左子树的结点,必间隔左子树的全部结点后再重复出现;如A,B,D等结点。反之马上就会重复出现。如C,E,F,G等结点。时间复杂度以访问结点的次数为主,精确值为2*n,时间渐近度为O(n).3.给定二叉树的两种遍历序列,分别是:前序遍历序列:D,A,C,E,B,H,F,G,I;中序遍历序列:D,C,B,E,H,A,G,I,F,试画出二叉树B,并简述由任意二叉树B的前序遍历序列和中序遍历序列求二叉树B的思想方法。或:或:WPL=8×3+4×4+5×4+16×2+9×3+12×3+26×2=207[注]:哈夫曼树的左右子树可以互换。.8(P604-26)试写出如图所示的二叉树分别按先序、中序、后序遍历时得到的结点序列。答:DLR:ABDFJGKCEHILMLDR:BFJDGKACHELIMLRD:JFKGDBHLMIECA9、(把如图所示的树转化成二叉树。答:注意全部兄弟之间都要连线(包括度为2的兄弟),并注意原有连线结点一律归入左子树,新添连线结点一律归入右子树。AB方案2的WPL=3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3结论:哈夫曼编码优于等长二进制编码六、算法设计题1.编写递归算法,计算二叉树中叶子结点的数目。解:思路:输出叶子结点比较简单,用任何一种遍历递归算法,凡是左右指针均空者,则为叶子,将其打印出来。法一:核心部分为:DLR(liuyu*root)/*中序遍历递归函数*/{if(root!=NULL){if((root->lchild==NULL)&&(root->rchild==NULL)){sum++;printf("%d\n",root->data);}DLR(root->lchild);DLR(root->rchild);}return(0);}法二:intLeafCount_BiTree(BitreeT)//求二叉树中叶子结点的数目{if(!T)return0;//空树没有叶子elseif(!T->lchild&&!T->rchild)return1;//叶子结点elsereturnLeaf_Count(T->lchild)+Leaf_Count(T->rchild);//左子树的叶子数加上右子树的叶子数}//LeafCount_BiTree2.写出求二叉树深度的算法,先定义二叉树的抽象数据类型。解:法一:intdepth(liuyu*root)/*统计层数*/{intd,p;/*注意每一层的局部变量d,p都是各自独立的*/p=0;if(root==NULL)return(p);/*找到叶子之后才开始统计*/else{d=depth(root->lchild);if(d>p)p=d;/*向上回朔时,要挑出左右子树中的相对大的那个深度值*/d=depth(root->rchild);if(d>p)p=d;}p=p+1;return(p);}法二:intGet_Depth(BitreeT)//求子树深度的递归算法{if(!T)return0;else{m=Get_Depth(T->lchild);n=Get_Depth(T->rchild);return(m>n?m:n)+1;}}//Get_Depth3、求二叉树中以元素值为x的结点为根的子树的深度。解:intGet_Sub_Depth(BitreeT,intx)//求二叉树中以值为x的结点为根的子树深度{if(T->data==x){printf("%d\n",Get_Depth(T));//找到了值为x的结点,求其深度exit1;}}else{if(T->lchild)Get_Sub_Depth(T->lchild,x);if(T->rchild)Get_Sub_Depth(T->rchild,x);//在左右子树中继续寻找}}//Get_Sub_Depth4.编写按层次顺序(同一层自左至右)遍历二叉树的算法。解:思路:既然要求从上到下,从左到右,则利用队列存放各子树结点的指针是个好办法。这是一个循环算法,用while语句不断循环,直到队空之后自然退出该函数。技巧之处:当根结点入队后,会自然使得左、右孩子结点入队,而左孩子出队时又会立即使得它的左右孩子结点入队,……以此产生了按层次输出的效果。level(liuyu*T)/*liuyu*T,*p,*q[100];假设max已知*/{intf,r;f=0;r=0;/*置空队*/r=(r+1)%max;q[r]=T;/*根结点进队*/while(f!=r)/*队列不空*/{f=(f+1%max);p=q[f];/*出队*/printf("%d",p->data);/*打印根结点*/if(p->lchild){r=(r+1)%max;q[r]=p->lchild;}/*若左子树不空,则左子树进队*/if(p->rchild){r=(r+1)%max;q[r]=p->rchild;}/*若右子树不空,则右子树进队*/}return(0);}法二:voidLayerOrder(BitreeT)//层序遍历二叉树{InitQueue(Q);//建立工作队列EnQueue(Q,T);while(!QueueEmpty(Q)){DeQueue(Q,p);visit(p);if(p->lchild)EnQueue(Q,p->lchild);if(p->rchild)EnQueue(Q,p->rchild);}}//LayerOrder5.编写算法判别给定二叉树是否为完全二叉树。答:intIsFull_Bitree(BitreeT)//判断二叉树是否完全二叉树,是则返回1,否则返回0{InitQueue(Q);flag=0;EnQueue(Q,T);//建立工作队列while(!QueueEmpty(Q)){{DeQueue(Q,p);if(!p)flag=1;elseif(flag)return0;else{EnQueue(Q,p->lchild);EnQueue(Q,p->rchild);//不管孩子是否为空,都入队列}}//whilereturn1;}//IsFull_Bitree分析:该问题可以通过层序遍历的方法来解决.与6.47相比,作了一个修改,不管当前结点是否有左右孩子,都入队列.这样当树为完全二叉树时,遍历时得到是一个连续的不包含空指针的序列.反之,则序列中会含有空指针.6、阅读下列算法,若有错,改正之。BiTreeInSucc(BiTreeq){答:这是找结点后继的程序。//已知q是指向中序线索二叉树上某个结点的指针,共有3处错误。//本函数返回指向*q的后继的指针。注:当rtag=1时说明内装后继指针,可r=q->rchild;//应改为r=q;直接返回,第一句无错。if(!r->rtag)当rtag=0时说明内装右孩子指针,但孩while(!r->rtag)r=r->rchild;//应改为子未必是后继,需要计算。中序遍历应当while(!r->Ltag)r=r->Lchild;先左再根再右,所以应当找左子树直到叶returnr;//应改为returnr->rchild;子处。r=r->lchild;直到LTag=1;应改为:while(!r->Ltag)r=r->Lchild;阅读下面程序,并回答有关问题。其中BSTree为用二叉链表表示的二叉排序树类型。简要说明程序功能。(5分)n个结点的满二叉树的深度h是多少?(3分)假设二叉排序树*bst是有n个结点的满二叉树,给出算法的时间复杂度。(2分)intProc(BSTree*bst,KeyTypeK){BSTreef,q,s;s=(BSTree)malloc(sizeof(BSTNode));s->key=K;s->lchild=NULL;s->rchild=NULL;if(*bst==NULL){*bst=s;return1;}f=NULL;q=*bst;while(q!=NULL){if(K<q->key){f=q;q=q->lchild;}else{f=q;q=q->rchild;}}if(K<f->key)f->lchild=s;elsef->rchild=s;return1;}解:在二叉排序树中插入关键字为K的结点h=log(n+1)或h=[logn]+1(方括号表示向下取整)2O(log(n+1))或O(logn)2试设计算法计算一棵给定二叉树上所有结点数目。假设二叉树的存储结构描述如下:typedefstructBiTNode{TElemTypedata;structBiTNode*lchild;*rchild;/*左右孩子指针*/}BiTNode,*BiT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年高级厨师聘请合同(含厨房设备维护服务)3篇
- 2025年度电梯安全监测系统采购安装合同范本3篇
- 2025年度文化教育培训机构合作办学合同4篇
- 2025年度农夫山泉矿泉水儿童饮料市场拓展合同4篇
- 2025年度租赁房屋安全检查及维护服务合同4篇
- 2025年度美容院美容院加盟店安全与卫生管理合同3篇
- 二零二五年度生态旅游区租赁与生态保护合同3篇
- 2025年度个人财产保险合同范本12篇
- 2025年度个人租赁合同(含租赁物更新及改造)
- 2025年个人消费贷款信用记录查询合同模板4篇
- 《天润乳业营运能力及风险管理问题及完善对策(7900字论文)》
- 医院医学伦理委员会章程
- 农民专业合作社财务报表(三张报表)
- 安宫牛黄丸的培训
- 妇科肿瘤护理新进展Ppt
- 动土作业专项安全培训考试试题(带答案)
- 大学生就业指导(高职就业指导课程 )全套教学课件
- 死亡病例讨论总结分析
- 第二章 会展的产生与发展
- 空域规划与管理V2.0
- JGT266-2011 泡沫混凝土标准规范
评论
0/150
提交评论