线索二叉树

原创 2016年05月31日 14:34:06
        普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。 
        若将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。
例如中序遍历结果:B D C E A F H G,实际上已将二叉树转为线性排列,显然具有唯一前驱和唯一后继。

1. 线索二叉树的定义
规定:
        1)若结点有左子树,则lchild指向其左孩子;否则, lchild指向其直接前驱(即线索);
        2)若结点有右子树,则rchild指向其右孩子;否则, rchild指向其直接后继(即线索) 。

为区别两种不同情况,特增加两个标志域(各1bit)
约定:
        当Tag域为0时,表示正常情况;
        当Tag域为1时,表示线索情况.
有关线索二叉树的几个术语:
        线索链表:用含Tag的结点样式所构成的二叉链表         
        线   索:指向结点前驱和后继的指针 
        线索二叉树:加上线索的二叉树  
        线    索   化:对二叉树以某种次序遍历使其变为线索二叉树的过程 
增加了前驱和后继等线索有什么好处? ——能方便找出当前结点的前驱和后继,不用堆栈也能遍历整个树。

线索二叉树的生成:
        线索化过程就是在遍历过程中修改空指针的过程: 将空的lchild改为结点的直接前驱; 将空的rchild改为结点的直接后继。
非空指针仍然指向孩子结点(称为“正常情况”)

线索二叉树的生成算法:
        目的:在依某种顺序遍历二叉树时修改空指针,添加前驱或后继。 
        注解:为方便添加结点的前驱或后继,需要设置两个指针:p指针→当前结点之指针;  pre指针→前驱结点之指针。
        技巧:当结点p的左、右域均空时,只改写它的左域(装入前驱pre),而其右域(后继)留给下一结点来填写。或者说,当前结点的指针p应当送到前驱结点的空右域中。 
        若p->lchild=NULL,则{p->Ltag=1;p->lchild=pre;}//p的前驱结点指针pre存入左空域 
        若pre->rchild=NULL, 则{pre->Rtag=1;pre->rchild=p;} //p存入其前驱结点pre的右空域


线索二叉树的遍历
        理论上,只要找到序列中的第一个结点,然后依次访问结点的后继直到后继为空时结束。
        但是,在线索化二叉树中,并不是每个结点都能直接找到其后继的,当标志为0时,R_child=右孩子地址指针,并非后继!需要通过一定运算才能找到它的后继。
        以中序线索二叉树为例: 对叶子结点(RTag=1),直接后继指针就在其rchild域内; 对其他结点(RTag=0),直接后继是其右子树最左下的结点; (因为中序遍历规则是LDR,先左再根再右)






版权声明:本文为博主原创文章,未经博主允许不得转载。

线索二叉树详解以及代码实现

参照《大话数据结构》188到194页。 一、二叉树的线索存储结构定义 /* 二叉树线索存储结构定义 Link = 0,代表指向左右孩子的指针 Thread= 1 代表指向前驱或...
  • u010889616
  • u010889616
  • 2015年10月30日 14:28
  • 672

二叉树线索化以及线索化的先序、中序、后序遍历

二叉树线索化以及线索化的先序、中序、后序遍历 有详细的图解 和 程序代码 解读,以及 为什么要线索化二叉树...
  • My_heart_
  • My_heart_
  • 2016年08月01日 18:04
  • 15836

线索二叉树原理及前序、中序线索化(Java版)

一、线索二叉树原理      前面介绍二叉树原理及特殊二叉树文章中提到,二叉树可以使用两种存储结构:顺序存储和二叉链表。在使用二叉链表的存储结构的过程中,会存在大量的空指针域,为了充分利用这些空指针域...
  • UncleMing5371
  • UncleMing5371
  • 2017年01月07日 17:02
  • 2760

线索二叉树基本操作详解

线索二叉树基本操作详解 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo)       遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得...
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2014年10月02日 09:38
  • 1935

Java实现特殊二叉树之线索二叉树

按照某种方式对而出色进行遍历,
  • u012736409
  • u012736409
  • 2014年08月18日 11:05
  • 2348

数据结构 线索二叉树 原理及实现

通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。   ...
  • AXuan_K
  • AXuan_K
  • 2014年11月16日 15:58
  • 1417

后序线索化二叉树及遍历(图解)

线索二叉树的后序遍历详细介绍,图解,特别适合初学者,以及懒得画图的童鞋了...
  • My_heart_
  • My_heart_
  • 2016年08月01日 19:31
  • 13160

线索二叉树的完整代码实现

线索二叉树的完整代码,可直接运行 代码如下://线索二叉树 #include #includetypedef char TElemType;typedef enum {Link,Thread} Po...
  • fengyanglian
  • fengyanglian
  • 2015年11月02日 11:24
  • 1747

二叉树的线索化

线索二叉树(Threaded BinaryTree) 1.线索二叉树的基本概念       遍历二叉树是以一定规则将二叉树中的结点排列成一个线性序列,得到二叉树中结点的先序序列、中序序列或后序序列。 ...
  • c18219227162
  • c18219227162
  • 2015年12月05日 19:33
  • 1732

【c++】二叉树的线索化

什么是二叉树的线索化?或者问什么是线索二叉树? 按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列。在改序列中,除第一个结点外每个结点有且仅有一个直接前驱结点;除最后一个结点外...
  • LLZK_
  • LLZK_
  • 2016年10月18日 16:36
  • 687
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线索二叉树
举报原因:
原因补充:

(最多只允许输入30个字)