美文网首页
线索二叉树的原理

线索二叉树的原理

作者: Gaizka | 来源:发表于2017-08-05 16:57 被阅读227次

线索二叉树的原理

通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。

因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。

记ptr指向二叉链表中的一个结点,以下是建立线索的规则:

(1)如果ptr->lchild为空,则存放指向中序遍历序列中该结点的前驱结点。这个结点称为ptr的中序前驱;

(2)如果ptr->rchild为空,则存放指向中序遍历序列中该结点的后继结点。这个结点称为ptr的中序后继;

显然,在决定lchild是指向左孩子还是前驱,rchild是指向右孩子还是后继,需要一个区分标志的。因此,我们在每个结点再增设两个标志域ltag和rtag,注意ltag和rtag只是区分0或1数字的布尔型变量,其占用内存空间要小于像lchild和rchild的指针变量。结点结构如下所示。

其中:

(1)ltag为0时指向该结点的左孩子,为1时指向该结点的前驱;

(2)rtag为0时指向该结点的右孩子,为1时指向该结点的后继;

(3)因此对于上图的二叉链表图可以修改为下图的养子。

线索化的实质就是将二叉链表中的空指针改为指向前驱或后继的线索。由于前驱和后继信息只有在遍历该二叉树时才能得到,所以,线索化的过程就是在遍历的过程中修改空指针的过程。

有了线索二叉树后,对它进行遍历时,其实就等于操作一个双向链表结构。

和双向链表结点一样,在二叉树链表上添加一个头结点,如下图所示,并令其lchild域的指针指向二叉树的根结点(图中第一步),其rchild域的指针指向中序遍历访问时的最后一个结点(图中第二步)。反之,令二叉树的中序序列中第一个结点中,lchild域指针和最后一个结点的rchild域指针均指向头结点(图中第三和第四步)。这样的好处是:我们既可以从第一个结点起顺后继进行遍历,也可以从最后一个结点起顺前驱进行遍历。

例子:

相关文章

  • 理解线索二叉树

    原链接:理解线索二叉树|CloudWong 线索二叉树原理 遍历二叉树的其实就是以一定规则将二叉树中的结点排列成一...

  • 线索二叉树学习

    线索二叉树一、线索二叉树的原理 因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索...

  • 数据结构与算法-线索二叉树

    线索二叉树 线索二叉树原理 通过观察上图可以看到,指针域利用的并不充分,有许多的"^",也就是空指针域的存在,这实...

  • 线索二叉树操作

    树节点 创建中序线索二叉树 遍历中序线索二叉树 创建前序线索二叉树 遍历前序线索二叉树 参考:https://bl...

  • 数据结构与算法-线索二叉树

    线索二叉树 线索二叉树原理 “首先我们要来看看这空指针有多少个呢?对于一个有n个结点的二叉链表,每个结点有指向左右...

  • 二叉树—线索二叉树

    1、线索二叉树的引入 在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或...

  • 数据结构与算法 线索二叉树

    线索二叉树原理:在一个二叉树中,在不是完全二叉树的情况下,二叉树结点的左孩子或者右孩子存在为NULL的情况,我们可...

  • 数据结构线索二叉树

    线索二叉树构成 线索化的节点 实现

  • javascript线索化二叉树

    定义二叉树创建方法 对二叉树进行中序线索化 遍历线索二叉树 测试

  • 第六章树的操作

    1,遍历二叉树的顺序和3中不同的打印顺序2,什么是线索二叉树,其原理是什么,解决了什么问题?3,树转化为二叉树的过...

网友评论

      本文标题:线索二叉树的原理

      本文链接:https://www.haomeiwen.com/subject/fhyzqxtx.html