版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/10/9,1,本课内容,1.遍历二叉树的算法(复习) 2.建立二叉树的算法 3.恢复二叉树 4.树、森林与二叉树的转换,遍历二叉树的递归算法,算法6.1前序遍历二叉树的递归算法 void preorder(bitree root) /* root为根结点,visit()为访问结点的函数 */ if ( root !=0)/* 二叉树非空 */ visit(root-data);/* 访问根结点 */ preorder(root-lchild);/* 遍历左子树(递归调用) */ preorder(root-rchild);/* 遍历右子树(递归调用) */ ,中序遍历二叉树的递归算法
2、 void Inorder(bitree root) /* root为根结点,visit()为访问结点的函数 */ if ( root !=0)/* 二叉树非空 */ Inorder(root-lchild);/* 遍历左子树(递归调用) */ visit(root-data);/* 访问根结点 */ Inorder(root-rchild);/* 遍历右子树(递归调用) */ ,后序遍历二叉树的递归算法 void PostOrder(bitree root) /* root为根结点,visit()为访问结点的函数 */ if ( root !=0)/* 二叉树非空 */ PostOrder(
3、root-lchild);/* 遍历左子树(递归调用) */ PostOrder(root-rchild);/* 遍历右子树(递归调用) */ visit(root-data);/* 访问根结点 */ ,4.二叉树的层次遍历,二叉树的层次遍历:即按照“从上到下,从左至右”的次序访问所有结点一次且仅一次。对一棵非空的二叉树,先访问根结点,再依次访问左孩子、右孩子,并记录该层结点的访问次序;依次访问各结点的左孩子和右孩子,直到访问到最右端的叶子结点。 层次遍历存在容易理解的非递归算法。这里有一个“依序访问下层结点”的问题,为了记录上一层结点的访问次序,需要使用队列。算法描述如下: 1)初始化队列Q
4、; 2)将根结点入队列; 3)当队列Q不空时,重复以下过程: 对头元素出队列,并访问该结点; 若该结点左孩子非空,访问左孩子并将左孩子入队; 若结点右孩子非空,访问右孩子并将右孩子入队; 实际上,结点的访问次序就是其进入队列的次序。,二叉树层次遍历的算法(应用辅助队列) void BTlayer( bitree root) linkqueue Q; /辅助队列 bitree P=root;/* P指向根结点 */ Init_queue(Q);/* 初始化队列 */ if (root) In_queue(Q,root); /* 根结点入队 */ while ( Q.front) /* 队列Q不空
5、时继续 */ P=dele_queue(Q);/* 出队,队头元素=P */ printf(“%c”,P-data);/* 访问结点数据 */ if (P-lchild) In_queue(Q,P-lchild);/* 左孩子入队 */ if (P-rchild) In_queue(Q,P-rchild); /* 右孩子入队 */ ,二、二叉树的建立算法(实验需掌握),按扩展的先序序列建立二叉树的算法 要求输入时表示出叶子结点。 如图所示: 输入序列为: A B D # G L # # # E # # C F H # # K # # # 其中的 # 表示空,算法6.4 按扩展先序序列建立二叉树
6、的算法,typedef char elemtype ;/* 结点数据为char型 */ bitree creatbit() /* 按输入的前序序列建立二叉树,输入以回车表示结束 */ /* 若创建成功,返回该二叉树的根,否则返回空指针 */ char ch; bitree T; scanf(“%c”,/* 返回根 */ ,遍历算法的应用,在遍历算法的基础上完成以下算法: 1.统计二叉树中的叶子结点个数 2.求二叉树的深度 3.统计二叉树中的结点总数,/统计二叉树深度的算法 int deepth(tnode *root) int lh,rh; if (root) /二叉树非空 lh=deepth
7、(root-lchild); /统计左子树深度 rh= deepth(root-rchild); /统计右子树深度 return (lhrh? lh: rh)+1; /最大深度+1 else return 0; ,三、构造二叉树,给定二叉树的一种遍历结果是无法确定二叉树的; 恢复二叉树指:根据给定的两种遍历结果,反推出该二叉树。 给定2 种遍历结果(中序、先序;或中序、后序)可唯一确定一棵二叉树; 注意:必须包括中序遍历。,练习:,1.由前序和中序遍历的序列构造二叉树 2.由后序和中序遍历的序列构造二叉树,2020/10/9,2020/10/9,13,树与二叉树的对应关系 树与二叉树均可用二叉
8、链表作为存储结构,因此给定一棵树,用二叉链表存储,可唯一对应一棵二叉树,反之亦然。 2树转换成二叉树 将一棵树转化为等价的二叉树方法如下: (1) 在树中各兄弟(堂兄弟除外)之间加一根连线。 (2) 对于任一结点,只保留它与最左孩子的连线,删去它与其余孩子之间的连线。 (3) 以树根为轴心,将整棵树按顺时钟方向旋转约45。 特点:根结点无右子树,6.4 树、森林与二叉树的转换,2020/10/9,14,图6-15树转换成二叉树,2020/10/9,15,3森林转换成二叉树 树和森林都可转换成二叉树,但树转换成二叉树后根结点无右分支,而森林转换后的二叉树,其根结点有右分支。 将森林转化为二叉树方
9、法如下: (1) 将森林中的每一棵树转换成等价的二叉树。 (2) 保留第一棵二叉树,自第二棵二叉树始,依次将后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有的二叉树依此相连后,所得到的二叉树就是由森林转化成的二叉树。 (3) 以树根为轴心,将整棵树按顺时钟方向旋转约45。 转换过程如图图6-16 。,2020/10/9,16,图6-16 森林和对应的二叉树,2020/10/9,17,4二叉树转换成森林 将当前根结点和其左子树作为森林的一棵树,并将其右子树作为 森林的其他子树; 重复上面直到某结点的右子树为空。,2020/10/9,18,6.4.3树与森林的遍历,1. 树的遍历 按访问
10、根结点和访问子树的次序不同,可以定义以下所述两种遍历方法: (1)先根遍历(或先序遍历) 若树非空,则遍历过程为: 第一步:访问根结点; 第二步:从左到右,依次先根遍历根结点的每一棵子树。 (2)后根遍历(或后序遍历) 若树非空,则遍历过程为: 第一步:从左到右,依次后根遍历根的每一棵子树; 第二步:访问根结点。 对照转换后所得二叉树可以发现:树的先根遍历与其转换后所得的二叉树的先根遍历结果一样,而树的后根遍历则对应该二叉树的中序遍历。所以,可以用二叉树的遍历算法解决树的遍历问题。,2020/10/9,19,2020/10/9,20,练习,1. 已知一棵二叉树的先序序列为E B A D C F H G I K J,中序序列为A B C D E F G H I J K,请画出该二叉树,并写出后序遍历的结果。 2. 已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院影像科医师2026年二季度影像诊断工作总结
- 工厂仓储物流专员2026年二季度仓储物流衔接总结
- 社区暑期青少年安全课堂课件
- 2026年秋季戏剧影视专业开学第一课 职业发展前景分析
- 2026年北师大版小学三年级数学上册《长方体和正方体》课时教案
- 髋关节置换护理
- 骨关节创伤后功能康复
- K3模具行业解决方案
- ATA分化型甲癌指南解读DavidCooper中文
- ICU医院感染目标性监测
- 供水管网有限空间方案
- 2026中国数联物流信息有限公司(上海)岗位招聘笔试历年参考题库附带答案详解
- 浦发银行银联交易系统:架构设计、技术实现与安全保障
- JJF(石化)084-2023润滑油蒸发损失测定仪(诺亚克法)校准规范
- 文印工作人员保密制度
- 水库沉降观测技术方案
- 电力设施安全防护技术规范手册
- 旅游投诉处理流程
- 人教A版(2019)高一数学必修第一册基础知识清单填空练习题(含答案)
- 秘书学沟通与协调课件
- 2025年Q1起重机指挥模拟考试题库(附答案)
评论
0/150
提交评论