<基于递归实现线索二叉树的构造及遍历算法探讨>

<基于递归实现线索二叉树的构造及遍历算法探讨>

前言:

  • 在学习《数据结构》的二叉树知识中,对于线索二叉树的原理及构造算法进行分析和模拟实现过程,最终进行整理以进行学习交流探讨。
  • 本笔记使用的是基于递归的思路进行实现模拟,要明确的是对于一种算法其具体的实现代码形式会因人而异,故这里只是其中一种算法代码形式,但其背后的本质都是线索二叉树的构造原理。
  • 本笔记使用部分王道考研—《数据结构》课件,在此向王道考研致以感谢!笔者记录整理一个通宵共耗时15小时完成。
  • 因此,本博文未经允许不得转载用于任何商业用途!如有转载请指明出处!
    ——By 作者:新晓·故知

1.线索二叉树的引入

  • 遍历二叉树是以一定的规则将二叉树中的结点排列成一个线性序列,从而得到几种遍历序列,使得该序列中的每个结点(第一个和最后一个除外)都有一个直接前驱和直接后继(基于遍历序列的前驱和后继),一般是按照实际需求去获得相应的前驱和后继。注意区分:(a)基于树的逻辑结构的前驱和后继(b)基于遍历序列的前驱和后继。
    (a)基于树的逻辑结构的前驱和后继
    在这里插入图片描述
    (b)基于遍历序列的前驱和后继
    在这里插入图片描述
    这里进行二叉树的遍历,是为了能够根据遍历的序列进行其他需求的处理操作等(以需求为导向),因此这里需要求出基于遍历顺序的前驱和后继。然而传统的二叉链表存储仅能体现一种父子关系,不能直接得到结点在遍历中的前驱和后继
    在这里插入图片描述
    试想:如何找到指定结点p在中序遍历序列中的前驱(基于遍历序列的前驱和后继)?在普通的二叉树中,每个结点只有指向孩子结点的指针,并不能从该结点往回找,因此不能直接从该结点找到p指向的F结点的中序遍历前驱A;对于F的中序遍历后继C也找不到。因此,每一次只能从头开始遍历,从根结点出发依次查找。这是普通二叉树存在的一个问题。
  • 在前面的学习中,可以得出:
    (1)一棵有n个结点的二叉树采用二叉链表存储结点,其中空指针的数量为n+1个。
    (2)一棵有n个结点的二叉树采用三叉链表存储结点,其中空指针的数量为n+2个。
    (3)一棵有n个结点的三叉树采用三叉链表存储结点,其中空指针的数量为2n+1个。

    上述证明很简单,这里不再赘述。
    那么根据(1)“在含n个结点的采用二叉链表存储结点的二叉树中,有n+1个空指针”由此设想能否利用这些空指针来存放指向其前驱或后继的指针?这样就可以像遍历单链表那样方便的遍历二叉树。引入线索二叉树正是为了加快查找结点前驱和后继的速度。

2.线索二叉树的基本概念及结构

在这里插入图片描述
规定:若无左子树,令lchild指向其前驱结点;若无右子树,令rchild指向其后继结点。如上图 所示,还需增加两个标志域,以标识指针域指向左(右)孩子或前驱(后继)。
其中,标志域的含义如下:

ltag=
0,lchild域指示结点的左孩子
1,lchild域指示结点的前驱
rtag=
0,rchild域指示结点的右孩子
1,rchild域指示结点的后继

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值