二叉树前驱后继的查找_第1页
二叉树前驱后继的查找_第2页
二叉树前驱后继的查找_第3页
二叉树前驱后继的查找_第4页
二叉树前驱后继的查找_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、线索二叉树的运算1査找某结点*p在指定次序下的前趋和后继结点(1)在中序线索二叉树中,查找结点*卩的中序后继结点在中序线索二叉树中,查找结点*p的中序后继结点分两种情形:若*p的右子树空(即p-rtag为Thread),则p-rchild为右线索,直接指向*p的中序后继。【例】下图的中序线索二叉树中,结点D的中序后继是A。AI-:M.LL000o0(心中序战盍二义郴【例】下图的中序线索二叉树中,结点D的中序后继是A。AI-:M.LL000o0(心中序战盍二义郴屮序线索二冥树及叭有储嵇构M/LL0 E0/匚11H1若*p的右子树非空(即p-rtag为Link),则*卩的中序后继必是其右子树中第一

2、个中序 遍历到的结点。也就是从*p的右孩子开始,沿该孩子的左链往下查找,直至找到一个没有 左孩子的结点为止,该结点是*p的右子树中最左下的结点,即*P的中序后继结点。【例】上图的中序线索二叉树中:A的中序后继是F,它有右孩子;F 的中序后继是 H ,它无右孩子;B 的中序后继是 D ,它是 B 的右孩子。在中序线索二叉树中求中序后继结点的过程可【参见动画演示】,具体算法如下:BinThrNode *InorderSuccessor(BinThrNode *p)/在中序线索树中找结点*卩的中序后继,设p非空BinThrNode *q;if (p-rtag=Thread) *p 的右子树为空Ret

3、urn p-rchild; /返回右线索所指的中序后继elseq=p-rchild;/从*p的右孩子开始查找while (q-ltag=Link)q=q-lchild; /左子树非空时,沿左链往下查找return q;/当 q 的左子树为空时,它就是最左下结点 /end if该算法的时间复杂度不超过树的高度h,即0(h)。在中序线索二叉树中查找结点*卩的中序前趋结点中序是一种对称序,故在中序线索二叉树中查找结点*p的中序前趋结点与找中序后继 结点的方法完全对称。具体情形如下:若*p的左子树为空,则p-lchild为左线索,直接指向*p的中序前趋结点;【例】上图所示的中序线索二叉树中,F结点的中

4、序前趋结点是A若*p的左子树非空,则从*p的左孩子出发,沿右指针链往下查找,直到找到一个没 有右孩子的结点为止。该结点是*p的左子树中最右下的结点,它是*p的左子树中最后一 个中序遍历到的结点,即*p的中序前趋结点。【例】上图所示中序线索二叉树中,结点E左子树非空,其中序前趋结点是I 在中序线索二叉树中求中序前趋结点的过程可【参见动画演示】,具体算法如下:BinThrNode *Inorderpre(BinThrNode *p)/在中序线索树中找结点*卩的中序前趋,设p非空BinThrNode *q;if (p-ltag=Thread) *p 的左子树为空return p-lchild; /返

5、回左线索所指的中序前趋elseq=p-lchild;从*p的左孩子开始查找while (q-rtag=Link)q=q-rchild;/右子树非空时,沿右链往下查找return q; /当 q 的右子树为空时,它就是最右下结点 /end if由上述讨论可知:对于非线索二叉树,仅从*p出发无法找到其中序前趋(或中序后继), 而必须从根结点开始中序遍历,才能找到*卩的中序前趋(或中序后继)。线索二叉树中的线索 使得查找中序前趋和中序后继变得简单有效。在后序线索二叉树中,查找指定结点*卩的后序前趋结点在后序线索二叉树中,查找指定结点*卩的后序前趋结点的具体规律是:若*p的左子树为空,则p-lchil

6、d是前趋线索,指示其后序前趋结点。【例】在下图所示的后序线索二叉树中,H的后序前趋是B, F的后序前趋是C。BEFDGH需序线窘二艾树NULL若BEFDGH需序线窘二艾树NULL若*p的左子树非空,则p-lchild不是前趋线索。由于后序遍历时,根是在遍历其左右子树之后被访问的,故*p的后序前趋必是两子树中最后一个遍历结点。当*卩的右子树非空时,*p的右孩子必是其后序前趋【例】在上图所示的后序线索二叉树中,A的后序前趋是E;当*卩无右子树时,*p的后序前趋必是其左孩子【例】在上图所示的后序线索二叉树中,E的后序前趋是F在后序线索二叉树中,查找指定结点*卩的后序后继结点具体的规律:若*p是根,则

7、*p是该二叉树后序遍历过程中最后一个访问到的结点。*p的后序后继 为空若*p是其双亲的右孩子,则*p的后序后继结点就是其双亲结点【例】上图所示的后序线索二叉树中,E的后序后继是A。若*p是其双亲的左孩子,但*P无右兄弟,*卩的后序后继结点是其双亲结点【例】上图所示的后序线索二叉树中,F的后序后继是E。若*p是其双亲的左孩子,但*p有右兄弟,则*卩的后序后继是其双亲的右子树中第一 个后序遍历到的结点,它是该子树中最左下的叶结点【例】上图所示的后序线索二叉树中,B的后序后继是双亲A的右子树中最左下的叶 结点 HF 是孩子树中最左下结点,但它不是叶子。由上述讨论中可知:在后序线索树中,仅从*p出发就能找到其后序前趋结点;要找*p 的后序后继结点,仅当*卩的右子树为空时,才能直接由*卩的右线索p-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论