“砖头变玉石”——深入浅出线索二叉树和普通二叉树间的相互转化

接触过数据结构的人对树、二叉树等有关树的名词都不会感到陌生。对于树的一些基本知识、概念这里就不再赘述了。本文主要是讲解一下线索二叉树、普通二叉树的转化。


在讲解这部分内容之前,有必要对线索二叉树做一些简短的介绍。


首先,为什么会出现线索二叉树这一名词?


我们先来看一下普通二叉树的存储结构:


结合一张图来看一下它的空间利用率:

“砖头变玉石”——深入浅出线索二叉树和普通二叉树间的相互转化_第1张图片

从上图中可以看出,普通二叉树存在很多的null值,造成了空间的浪费。加入普通二叉树中存在着n个结点,那么此树中共有2n个指针,但是有效利用的只有n-1个,而余下的n+1个都没有被利用,是null。线索二叉树就是要将n+1个空指针利用起来,用于存储节点的前后关系。同时,线索链表解决了二叉链表找左、右孩子困难的问题。


那么线索二叉树是如何来实现上面提到的功能的呢?


线索二叉树的表示方式:

“砖头变玉石”——深入浅出线索二叉树和普通二叉树间的相互转化_第2张图片

表面上看,线索二叉树多了两块区域:Lbit、Rbit。比普通二叉树多占用了空间,但是Lbit、Rbit是逻辑型的,每个只需要一个“位”就可以了,很省空间,不会造成浪费。那么它们两个有什么作用呢?其功能就是:

“砖头变玉石”——深入浅出线索二叉树和普通二叉树间的相互转化_第3张图片

好了,介绍了线索二叉树的来龙去脉,下面就来讲讲如何将普通二叉树转化为线索二叉树


在这里有一个前提是:需要知道几个概念,二叉树树的前序遍历、后序遍历、中序遍历。在这里呢只是告诉大家一个简短的记忆方法。

前序遍历:根—左子树—右子树;后序遍历:左子树—右子树—根;中序遍历:左子树—根—右子树。


先睹为快:普通二叉树、线索二叉树直观图

“砖头变玉石”——深入浅出线索二叉树和普通二叉树间的相互转化_第4张图片

步骤(我们以中序遍历为例):

首先将下面二叉树进行中序遍历,写出最后结果。

“砖头变玉石”——深入浅出线索二叉树和普通二叉树间的相互转化_第5张图片

结果是:D B H E A F C G I

然后,将叶子结点的前继、后续,按照上面的结果的前后顺序连接在成线(红线表示后继)

“砖头变玉石”——深入浅出线索二叉树和普通二叉树间的相互转化_第6张图片

对于其他两种遍历这里就不再赘述了,在这里只给出追后的结果,大家可以尝试自己动手。对于不懂的,可以联系我一起讨论。

“砖头变玉石”——深入浅出线索二叉树和普通二叉树间的相互转化_第7张图片

对于普通二叉树转为线索二叉树的关键是先将普通二叉树的几种遍历顺序写出来,然后在理解线索二叉树的作用之后就可以完成他们之间的转化。





你可能感兴趣的:(“砖头变玉石”——深入浅出线索二叉树和普通二叉树间的相互转化)