线索二叉树(前中后序线索化/遍历/画线索)

线索二叉树是一种通过在二叉树节点的空指针域添加线索,加速查找前驱和后继节点的数据结构。文章详细介绍了线索二叉树的构造过程,包括中序、先序和后序线索化的方法,并提供了相应的代码实现。此外,还阐述了线索二叉树的遍历策略,如中序、先序和后序遍历的具体步骤。

线索二叉树

1 线索二叉树的基本概念

对一棵二叉树中所有结点的空指针域按照某种遍历方式加线索的过程叫作线索化,被线索化了的二叉树称为线索二叉树(Threaded binary tree)。

引入线索二叉树的目的是:加快查找结点前驱和后继的速度

注:概念题也是会考的!( ^ ^)/~


2 线索二叉树的构造

2.1 线索二叉树的存储结构

图1 线索二叉树的结点结构

图1 ltag和rtag的设定

简单来说,ltag和rtag的作用:标明指针是否用作线索标志。

二叉树的存储结构代码描述如下:

typedef struct TBTNode{
   
   
	ElemType data;	//数据元素
	struct TBTNode *lchild, *rchild;	//左右孩子指针
	int ltag, rtag;		//左右线索标志
}TBTNode;

2.2 给线索二叉树画线索

2.2.1 中序

以下图的一棵二叉树为例,我们首先来讲解一下中序线索二叉树的建立过程:

图1 一棵二叉树

图2 在二叉树上添加中序线索

第一步,写出它的中序遍历序列,于是我们可以得到序列为:CBEGDFA

第二步,根据中序序列,画出线索即可:

从中序遍历序列的第一个结点看起。也就是C结点,因为左右孩子均为空,所以得画上两条线索。因为中序序列CBEGDFA中,C前面没字母,换言之就是在中序序列中没有前驱,所以左边的线索指向NULL,而C的后面一个字母是B,故结点右边的线索指向B结点。

再来看E结点,因为左孩子为空,所以只需画上一条左边的线索。因为中序序列CBEGDFA中,E前面字母是B,换言之就是在中序序列中E的前驱结点是B,所以左边的线索指向B结点。

就这么简单~


2.2.2 先序

以下图的一棵二叉树为例,我们首先来讲解一下先序线索二叉树的建立过程:

图3 一棵二叉树

图4 添加先序线索

第一步,写出它的先序遍历序列,于是我们可以得到序列为:RADEBCFGHK

然后根据遍历序列前后字母位置关系画线索即可。

2.2.3 后序

图5 一棵二叉树

图6 添加后序线索

第一步,写出它的后序遍历序列,于是我们可以得到序列为:bcjdahigfe

然后根据后序遍历序列顺序给空孩子添加前驱后继线索即可。

比如j结点,左右孩子为空,那么需添加两条线索。因为后序遍历序列中j前面是c,后面是d,于是j左线索指向c,右线索指向d

2.3 二叉树线索化代码实现

2.3.1 通过中序遍历线索化

通过中序遍历对二叉树线索化的递归算法如下:

二叉树的存储结构代码:

typedef struct TBTNode{
   
   
	char data;	//数据元素
	struct TBTNode *lchild, *rchild;	//左右孩子指针
	int ltag, rtag;		//左右线索标志
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值