线索二叉树 旧城等待, 2022-02-23 08:36 248阅读 0赞 本文主要介绍**线索二叉树**和**树、二叉树、森林**三者之间的相互转换。 对于线索二叉树,这里只做简单介绍,着重还是要理解上篇博文中二叉树的各种遍历算法。 ## 线索二叉树 ## ### 基本概念 ### 遍历二叉树的**实质就是对一个非线性结构进行线性化操作**,使在这个访问序列中每一个结点(除第一个和最后一个)都有一个**直接前驱和直接后继**。 传统的链式存储仅能体现一种父子关系,不能直接得到结点在遍历中的前驱和后继。通过观察,我们发现在二叉链表表示的二叉树中存在大量的空指针,若利用这些空链域存放指向其直接前驱或后继的指针,则可以方便的运用某些二叉树操作算法。**引入线索二叉树的目的是为了加快查找结点前驱和后继的速度**。 在二叉树线索化时,通常规定: 1. 若无左子树,令 l c h i l d lchild lchild指向其前驱结点,若无右子树,令 r c h i l d rchild rchild指向其后继结点 2. 还需增加两个标志域表明当前指针域所指的对象是指向左(右)子结点还是直接前驱(后继) ![1.jpg][] **线索二叉树存储结构描述如下**: typedef struct ThreadNode{ ElemType data; //数据元素 struct ThreadNode *lchild,*rchild; //左、右孩子指针 int ltag,rtag; //左、右线索标志 }ThreadNode,*ThreadTree; ### 线索二叉树的构造 ### 对二叉树的线索化,实质上就是遍历一次二叉树,只是在遍历的过程中,检查当前结点左、右指针域是否为空,若为空,将它们改为指向前驱结点或后继结点的线索。 下面以**中序线索二叉树**建立为例,指针 p r e ( s u c ) pre(suc) pre(suc)指向中序遍历时上一个刚访问过(下一个访问)的结点,如下图所示(**中序遍历为 B D A E C**): ![2.jpg][] **下面给出中序遍历时对二叉树线索化的递归算法** void InThread(ThreadTree &p,ThreadTree &pre){ if(p!=NULL){ InThread(p->lchild,pre); //递归,线索化左子树 if(p->lchild==NULL){ //左子树为空,建立前驱线索 p->lchild=pre; p->tag=1; } if(pre!=NULL&&pre->rchild==NULL){ pre->rchild=p; //建立前驱结点的后继线索 pre->rtag=1; } pre=p; //标记当前结点成为刚刚访问过的结点 InThread(p->rchild,pre) //递归,线索化右子树 } } **调用上述方法,建立中序线索二叉树的主过程** void CreateInThread(ThreadTree T){ ThreadTree pre=NULL; if(T!=NULL){ //非空二叉树,线索化 InThread(T,pre); //线索化二叉树 pre->rchild=NULL; //处理遍历的最后一个结点 pre->rtag=1; } } ## 树、森林、二叉树的相互转换 ## 在介绍转换方法前,我们先来看一下树的存储结构 ![3.jpg][] ### 树 -----> 二叉树 ### ![4.jpg][] ### 森林 -----> 二叉树 ### ![5.jpg][] ### 二叉树 -----> 树 ### ![6.png][] ![7.jpg][] ### 二叉树 -----> 森林 ### ![8.jpg][] **树和森林的遍历可采用对应二叉树遍历算法实现**,与二叉树遍历的对应关系如下表所示: <table> <thead> <tr> <th align="center">树</th> <th align="center">森林</th> <th align="center">二叉树</th> </tr> </thead> <tbody> <tr> <td align="center">先根遍历</td> <td align="center">先序遍历</td> <td align="center">先序遍历</td> </tr> <tr> <td align="center">后根遍历</td> <td align="center"><font>中序遍历</font></td> <td align="center"><font>中序遍历</font></td> </tr> </tbody> </table> [1.jpg]: /images/20220223/eaae1a7089624e1cbd314e33e11634fa.png [2.jpg]: /images/20220223/7d5c345951654f38990b07b4719c8788.png [3.jpg]: /images/20220223/4c6e773d9cae48a0b34da6e8bf7aedbe.png [4.jpg]: /images/20220223/1d2404f017fb4642ba0531cdff873c85.png [5.jpg]: /images/20220223/bba8504737394e99b493c2bd992dd8b3.png [6.png]: /images/20220223/7223b0094b9548db8a8a8a87d457e98c.png [7.jpg]: /images/20220223/fc92c4867f9d43b8a28c320a6a0626ae.png [8.jpg]: /images/20220223/80f0af340b904551b3f01d87e26c4192.png
相关 树——二叉树——线索二叉树 一、线索二叉树 (1)什么是线索化 将二叉树以某种次序将其遍历, 得到线性序列, 就是将非线性结构进行线索化。 线索化的优点就是可以很快地得到前驱或后继。 如 梦里梦外;/ 2023年06月13日 09:35/ 0 赞/ 13 阅读
相关 线索二叉树 一 概述 遍历二叉树是以一定的规则将二叉树中的结点排列成一个线性序列,从而得到几种遍历序列,使得该序列中的每个结点(第一个和最后一个结点除外)都有一个直接前驱和直接后继。 ﹏ヽ暗。殇╰゛Y/ 2022年12月09日 02:46/ 0 赞/ 9 阅读
相关 线索二叉树 1.基本概念 对于某些二叉树而言,其指针域的空间不能被充分利用。因此我们可以考虑利用那些空的指针域来存放指向结点在某种遍历次序下的前驱和后继结点的地址。我们把这种指向前 怼烎@/ 2022年06月14日 03:48/ 0 赞/ 188 阅读
相关 线索二叉树 线索化二叉树相对于之前的树的遍历,在树的定义上增加了两个值,一个是ltag,另外一个是rtag。 ltag代表着这个节点的是否有右孩子,如果有,则ltag=1,p->lchi 以你之姓@/ 2022年06月09日 01:13/ 0 赞/ 216 阅读
相关 线索二叉树 二叉树的链式存储如下图, ![Image 1][] 不难发现,图中所示的左—右指针表示中,有一半以上的指针是空的。事实上,所有包括n个结点的二叉树的这种表示中,每个结 秒速五厘米/ 2022年05月29日 00:18/ 0 赞/ 183 阅读
相关 线索二叉树 线索二叉树提出的原因: 在普通二叉树中,每个结点都有左右两个指针域,这些指针域都指向结点类型的数据对象,当二叉树稀疏时,很多结点的左右两个指针域就显得浪费存储空间了。因此,提 待我称王封你为后i/ 2022年03月15日 13:24/ 0 赞/ 276 阅读
相关 线索二叉树 本文主要介绍线索二叉树和树、二叉树、森林三者之间的相互转换。 对于线索二叉树,这里只做简单介绍,着重还是要理解上篇博文中二叉树的各种遍历算法。 线索二叉树 基本概念 旧城等待,/ 2022年02月23日 08:36/ 0 赞/ 249 阅读
相关 线索二叉树 什么是线索二叉树? 遍历二叉树是以一定的规则将二叉树中的结点排列成一个线性序列,从而等到二叉树的各种遍历序列,其实质是对一个非线性操作进行线性化操作,使这个访问序列中的每 女爷i/ 2022年01月23日 08:15/ 0 赞/ 277 阅读
相关 线索二叉树 package com.tree; import java.util.concurrent.SynchronousQueue; / 红太狼/ 2021年10月15日 02:37/ 0 赞/ 327 阅读
相关 线索二叉树 Overview 将二叉树中没有子节点的节点称为空指针域,利用二叉树的空指针域,按照前中后某种遍历方式存放对应的前驱节点,后驱节点(这种附加指针称为“线索”)。二叉树的空 矫情吗;*/ 2021年10月01日 09:34/ 0 赞/ 372 阅读
还没有评论,来说两句吧...