文章目录
线索二叉树的基本概念
在二叉树的学习中,我们知道,在有 n n n个结点的二叉树中,有 n − 1 n-1 n−1个空指针。这是因为每个叶结点有2个空指针,而每个度为1的结点有1个空指针,总的空指针数为 2 n 0 + n 1 2n_0+n_1 2n0+n1,又 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1,所以总的空指针数为 n 0 + n 1 + n 2 + 1 = n + 1 n_0+n_1+n_2+1=n+1 n0+n1+n2+1=n+1。
为此,可以改造二叉树的结点,在结点的空指针域中存放该结点在某种遍历次序下的前驱结点或后继结点的指针,并称之为线索。对一棵二叉树中的所有结点的空指针域按照某种遍历次序加线索的过程叫做线索化,被线索化了的二叉树称作线索二叉树。
引入线索二叉树是为了加快查找结点前驱和结点后继的速度。
在空的左指针域中存放的指向其前驱结点的指针叫做前驱线索,在空的右指针域中存放的指向其后继结点的指针叫做后继线索。
线索二叉树的构造
在二叉树线索化时,通常规定:若无左子树,令
l
c
h
l
i
d
lchlid
lchlid指向其前驱结点;若无右子树,令
r
c
h
i
l
d
rchild
rchild指向其后继结点。
为此,还需要增加两个标志域表明当前指针域所指的对象是指向左(右)子结点还是指向其直接前驱(后继)。
其中,标志域的含义如下:
l
t
a
g
{
0
,
l
c
h
i
l
d
域
指
示
结
点
的
左
孩
子
1
,
l
c
h
i
l
d
域
指
示
结
点
的
直
接
前
驱
r
t
a
g
{
0
,
r
c
h
i
l
d
域
指
示
结
点
的
右
孩
子
1
,
r
c
h
i
l
d
域
指
示
结
点
的
直
接
后
继
ltag\begin{cases} 0,\quad lchild域指示结点的左孩子\\ 1,\quad lchild域指示结点的直接前驱\\ \end{cases} \quad\quad rtag\begin{cases} 0,\quad rchild域指示结点的右孩子\\ 1,\quad rchild域指示结点的直接后继\\ \end{cases}
ltag{0,lchild域指示结点的左孩子1,lchild域指示结点的直接前驱rtag{0,rchild域指示结点的右孩子1,rchild域指示结点的直接后继
用不同的顺序遍历二叉树,在遍历过程中将线索加入到空的指针域,可得到相应的线索二叉树。
以中序线索二叉树的建立为例: