版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6.3遍历二叉树和线索二叉树一、遍历二叉树(TraversingBinaryTree)遍历定义——指按某条搜索路线遍访每个结点且不重复(又称周游)。遍历用途——它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。
遍历方法——牢记一种约定,对每个结点的查看都是“先左后右”。1遍历规则———二叉树由根、左子树、右子树构成,定义为D、
L、RD、L、R的组合定义了六种可能的遍历方案:LDR,LRD,DLR,DRL,RDL,RLD若限定先左后右,则有三种实现方案:
DLRLDRLRD先(根)序遍历中(根)序遍历后(根)序遍历
注:“先、中、后”的意思是指访问的结点D是先于子树出现还是后于子树出现。2例1:先序遍历的结果是:中序遍历的结果是:后序遍历的结果是:ABCDEABDECDBEACDEBCA口诀:DLR—先序遍历,即先根再左再右LDR—中序遍历,即先左再根再右LRD—后序遍历,即先左再右再根3遍历的算法实现:用递归形式格外简单!回忆1:二叉树结点的数据类型定义:typedefstructnode*tree_pointer;typedefstructnode{intdata;tree_pointerleft_child,right_child;}node;则三种遍历算法可写出:回忆2:第1章自测卷4.2题:longintfact(n)//求n!intn;{longf;if(n>1)f=n*fact(n-1);elsef=1;return(f);}5先序遍历算法DLR(liuyu*root){if(root!=NULL)//非空二叉树
{printf(“%d”,root->data);//访问DDLR(root->lchild);//递归遍历左子树DLR(root->rchild);//递归遍历右子树}return(0);}中序遍历算法LDR(x*root){if(root!=NULL){LDR(root->lchild);printf(“%d”,root->data);
LDR(root->rchild);}return(0);}后序遍历算法LRD(x*root){if(root!=NULL)
{LRD(root->lchild);LRD(root->rchild);printf(“%d”,root->data);}return(0);}结点数据类型自定义typedefstructliuyu{intdata;structliuyu*lchild,*rchild;}liuyu;liuyu*root;
6对遍历的分析:1.从前面的三种遍历算法可以知道:如果将print语句抹去,从递归的角度看,这三种算法是完全相同的,或者说这三种遍历算法的访问路径是相同的,只是访问结点的时机不同。从虚线的出发点到终点的路径上,每个结点经过3次。AFEDCBG第1次经过时访问=先序遍历第2次经过时访问=中序遍历第3次经过时访问=后序遍历2.二叉树遍历的时间效率和空间效率时间效率:O(n)
//每个结点只访问一次空间效率:O(n)
//栈占用的最大辅助空间(精确值:树深为k的递归遍历需要k+1个辅助单元!)7例:【严题集6.42③】编写递归算法,计算二叉树中叶子结点的数目。
思路:输出叶子结点比较简单,用任何一种遍历算法,凡是左右指针均空者,则为叶子,将其统计并打印出来。DLR(liuyu*root)//采用中序遍历的递归算法{if(root!=NULL)//非空二叉树条件,还可写成if(root){if(!root->lchild&&!root->rchild)//是叶子结点则统计并打印{sum++;printf("%d\n",root->data);}
DLR(root->lchild);//递归遍历左子树,直到叶子处;
DLR(root->rchild);}//递归遍历右子树,直到叶子处;}return(0);}8习题讨论:1.求二叉树深度,或从x结点开始的子树深度。
算法思路:只查各结点后继链表指针,若左(右)孩子的左(右)指针非空,则层次数加1;否则函数返回。技巧:递归时应当从叶子开始向上计数,层深者保留。否则不易确定层数。2.按层次输出二叉树中所有结点。
算法思路:既然要求从上到下,从左到右,则利用队列存放各子树结点的指针是个好办法,而不必拘泥于递归算法。技巧:当根结点入队后,令其左、右孩子结点入队,而左孩子出队时又令它的左右孩子结点入队,……由此便可产生按层次输出的效果。ABCDE10特别讨论:若已知先序/后序遍历结果和中序遍历结果,能否“恢复”出二叉树?【严题集6.31④】
证明:由一棵二叉树的先序序列和中序序列可唯一确定这棵二叉树。
例:已知一棵二叉树的中序序列和后序序列分别是BDCEAFHG和DECBHGFA,请画出这棵二叉树。分析:①由后序遍历特征,根结点必在后序序列尾部(即A);②由中序遍历特征,根结点必在其中间,而且其左部必全部是左子树子孙(即BDCE),其右部必全部是右子树子孙(即FHG);③继而,根据后序中的DECB子树可确定B为A的左孩子,根据HGF子串可确定F为A的右孩子;以此类推。12问:用二叉链表法(l_child,r_child)存储包含n个结点的二叉树,结点的指针区域中会有多少个空指针?分析:用二叉链表存储包含n个结点的二叉树,结点必有2n个链域(见二叉链表数据类型说明)。 除根结点外,二叉树中每一个结点有且仅有一个双亲(直接前驱),所以只会有n-1个结点的链域存放指针,指向非空子女结点(即直接后继)。思考:二叉链表空间效率这么低,能否利用这些空闲区存放有用的信息或线索?——我们可以用它来存放当前结点的直接前驱和后继等线索,以加快查找速度。所以,空指针数目=2n-(n-1)=n+1个。n+114二、线索二叉树(ThreadedBinaryTree)普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。若将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。两种解决方法增加两个域:fwd和bwd;利用空链域(n+1个空链域)存放前驱指针存放后继指针如何预存这类信息?例如中序遍历结果:BDCEAFHG,实际上已将二叉树转为线性排列,显然具有唯一前驱和唯一后继!可能是根、或最左(右)叶子15规定:1)若结点有左子树,则lchild指向其左孩子;否则,lchild指向其直接前驱(即线索);2)若结点有右子树,则rchild指向其右孩子;否则,rchild指向其直接后继(即线索)。为了避免混淆,增加两个标志域,如下图所示:lchildLTagdataRTagrchild约定:当Tag域为0时,表示正常情况;当Tag域为1时,表示线索情况.16有关线索二叉树的几个术语:线索链表:用前页结点结构所构成的二叉链表线索:指向结点前驱和后继的指针线索二叉树:加上线索的二叉树(图形式样)线索化:对二叉树以某种次序遍历使其变为线索二叉树的过程注:在线索化二叉树中,并不是每个结点都能直接找到其后继的,当标志为0时,则需要通过一定运算才能找到它的后继。17dataAGEIDJHCFBltag0011110101rtag0001010111AGEIDJHCFB例1:带了两个标志的某先序遍历结果如表所示,请画出对应二叉树。18对应的中序线索二叉树存储结构如图所示:00A00C00B11E11F11G00D11I11H注:此图中序遍历结果为:H,D,I,B,E,A,F,C,G0--root0204.【2000年计算机系考研题】给定如图所示二叉树T,请画出与其对应的中序线索二叉树。
2825405560330854解:因为中序遍历序列是:5540256028083354对应线索树应当按此规律连线,即在原二叉树中添加虚线。NILNIL21voiditer_inorder(tree_pointernode){inttop=-1;/*initializestack*/tree_pointerstack[MAX_STACK_SIZE];for(;;){for(;node;node=node->left_child)add(&top,node);/*addtostack*/node=delete(&top);/*deletefromstack*/if(!node)break;/*emptystack*/printf(“%D”,node->data);node=node->right_child;}}时间复杂度O(n)附:中序遍历迭代算法(利用堆栈)23voidlevel_order(tree_pointerptr)/*lev
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版机械行业科技创新合作合同书3篇
- 二零二五版艺术品字画购销与仓储管理合同2篇
- 二零二五版农业用地土壤环境质量调查委托合同3篇
- 二零二五版LED显示屏安全防护与应急响应合同3篇
- 美容院商铺租赁合同(2025版):美容院美容美体设备租赁及售后服务协议2篇
- 二零二五年绿色建筑空调系统设计与施工合同3篇
- 二零二五版废旧设备买卖及环保处理合同2篇
- 二零二五版房地产投资合作三方买卖合同3篇
- 二零二五版二手车鉴定评估及转让合同3篇
- 2025年度不锈钢太阳能板安装工程合同3篇
- GB/T 12914-2008纸和纸板抗张强度的测定
- GB/T 1185-2006光学零件表面疵病
- ps6000自动化系统用户操作及问题处理培训
- 家庭教养方式问卷(含评分标准)
- 城市轨道交通安全管理课件(完整版)
- 线缆包覆挤塑模设计和原理
- TSG ZF001-2006 安全阀安全技术监察规程
- 部编版二年级语文下册《蜘蛛开店》
- 锅炉升降平台管理
- 200m3╱h净化水处理站设计方案
- 个体化健康教育记录表格模板1
评论
0/150
提交评论