数据结构学习笔记-线索二叉树

来源:互联网 发布:mysql 新建数据库 编辑:程序博客网 时间:2024/05/15 05:18

线索二叉树

二叉树遍历的实质:以一定的规则将一个非线性结构进行线性化操作,使每个结点在这些线性序列中有且仅有一个直接前驱和直接后继。但是,当以二叉链表为存储结构时只能在遍历的过程中才能得到结点的前驱、后继,为了存储这种信息。引入线索二叉树。

根据二叉树的性质有:n0=n2+1,空链域:2n0+n1(也就是叶子结点有2个空链域,度为1的结点有1个空链域)另外有n=n0+n1+n2因此,有n个结点组成的二叉树中,有n+1个指针是空指针。二叉树的线索化就是将这些空指针进行修改的过程。

线索二叉树的结点中分别添加了LTag和RTag标志域

结点的结构为lchild、LTag、data、RTag、rchild,以这种结点结构构成的二叉链表作为二叉树的存储结构,叫做线索链表,其中指向结点前驱和后继的指针,叫做线索。对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化

线索二叉树的产生

构造线索二叉树和构造普通的二叉树方法相似,区别有两点:

1>结点结构不同

2>构造线索二叉树时,若有左右孩子结点,还要给左右标志赋值0(Link)

需要注意的是对一棵给定的二叉树,其先序、中序、后序和层序遍历的顺序是不同的。显然,其线索化的操作和遍历的操作也是不同的。下面以中序线索二叉树为例进行说明。

中序线索二叉树的存储结构和普通二叉树的存储结构,区别有三点:

1>线索二叉树多了一个头结点。其左孩子指针指向根结点,右孩子指针指向中序遍历的最后一个结点。

2>它每个结点的左右孩子指针都不是空指针。在没有孩子的情况下分别指向该结点的前驱和后继

3>中序遍历的第1个结点的左孩子指针(线索)和最后1个结点的右孩子指针(线索)都指向头结点。其目的是标志遍历的起点和终点。

生成中序线索二叉树分两步:

1>产生线索链表

2>将链表线索化

首先,给出产生线索链表的代码,以及用到的结构体

生成线索链表的方法跟生成普通的二叉树很类似,区别在于结点不同,以及多了两条用来设定LTag和RTag的if语句。
其次,给出链表的中序线索化
线索化中引入了一个头结点,该头结点的左孩子指向根结点,右孩子指向中序遍历的最后一个结点,因此LTag=Link,RTag=Thread。另外,中序遍历的第一个结点的前驱指向头结点(即该结点的lchild域指向头结点),遍历的最后一个结点的后继也指向头结点(即该结点的rchild域指也向头结点)。目的是:即可从第一个结点起顺后继进行遍历,也可从最后一个结点起顺前驱进行遍历。
线索二叉树的中序遍历(这里是从第一个结点起顺后继遍历):
 
0 0
原创粉丝点击