- List item
一.定义
- 前驱与后继:在二叉树的先序、中序或后序遍历序列中两个相邻的结点互称为前驱与后继。
- 线索:指向前驱或后继结点的指针称为线索。
- 线索二叉树:加上线索的二叉链表表示的二叉树叫线索二叉树。
- 线索化:将二叉树变为线索二叉树的过程称为线索化。
二. 指针域
三.线索链表的类型描述:
typedef struct BiThrNode {
TElemType data;
BiThrNode *lchild, *rchild; // 左右指针
int ltag, rtag; // 左右标志, 0:指针,1:线索
} BiThrNode,*BiThrTree;
四. 建立线索二叉树
附设一个指针pre始终指向刚访问的结点,若指针p指向当前访问的结点,则pre指向他的前驱。
下面以中序线索树的建立为例,介绍在中序遍历过程中如何修改结点的左、右指针域,以保存当前访问结点的“前驱”和“后继”信息。附设指针pre, 并始终保持指针pre指向当前访问的由指针p所指结点的前驱。
// 建前驱线索
if (p->lchild==NULL)
{
p->ltag = 1;
p->lchild = pre;
}
// 建后继线索
if (pre->rchild==NULL)
{
pre->rtag = 1;
pre->rchild = p;
}
- 头结点: ltag=0, lchild指向根结点
- rtag=1, rchild指向遍历序列中最后一个结点
- 遍历序列中第一个结点的lchild域和最后一个结点的rchild域都指向头结点
#include <iostream>
using namespace std;
void inorderthreading(bitree &thrt,bitree t)
{
thrt=new bitree;
thrt->ldag=0;
thrt->rdag=1;
if(!t) thrt->rchild=pre;//如果树为空
else {
thrt->lchild=t;//头结点与树的根链接
pre=thrt;//pre为遍历节点的p的前驱
inthreathing(t);//对t进行线索化
pre->rchild=thrt;//线索化完即遍历到最后一个右节点,将右节点的后驱为pre,所以将pre的右节点与头链接
pre->rtag=1;
//将这个标志变成1
}
}
void inthreathing(bitree t)//递归法线索化
{
if(p)
{
intreathing(t->lchild);
if(!p->lchild)
{ p->ltag=1;
p->rchild=pre;
}
if(!pre->rchild)
{ pre->rtag=1;
pre->rchild=p;
}
pre=p;
}
}