1. 线索二叉树的存储结构
typedef struct BiThrNode
{
char date;//数据域
struct BiThrNode *lchild,*rchild;
int ltag;//左标记
int rtag;//有标记
}BiThrNode,*BiThrTree;
2. 二叉树的中序线索化
(1)实现步骤
-
设置一个指针pre,始终指向刚刚访问过的结点(当前结点的前一个结点),刚开始pre置为NULL;
-
从树根开始,先遍历到最深的左孩子结点,如果该结点没有左孩子,将ltag置为1,令lchild指针指向pre前驱,否则将ltag置为0,其lchild指针仍然指向左孩子结点;
-
如果前驱没有右孩子结点,将前驱的rtag置为1做标记,令其rchild指针指向当前结点p,保持pre=p继续遍历,接着遍历右子树。
(2)图示
(3)代码实现
BiThrTree pre=new BiTreNode;
void InThreading(BiThrTree& p,BiThrTree& pre)
{
//使用两个结点p、pre
//初始时pre为空,p为根结点
//注意pre始终比慢一步
if(p!=NULL)
{
InThreading(p->lchild,pre);//递归,线索化左子树
if(p->lchild==NULL)
{//左子树为空时,建立前驱线索
p->ltag=1;
p->lchild=pre;
}
else p->ltag=0;//左子树不为空则ltag为0,左指针指向其左孩子
if(pre!=NULL&&pre->rchild==NULL)
{//pre(当前结点即p)不为空且其右子树为空则建立后继线索
pre->rtag=1;
pre->rchild=p;
}
else pre->rtag=0;//右子树不为空则ltag为0,右指针指向其右孩子
pre=p;//pre后移
InThreading(p->rchild);//递归,线索化右子树
}
}
void CreatInThrd(BiThrTree& T)
{
BiThrTree pre = NULL; //因为第一个结点一开始无前驱
if (T != NULL)
{
InThreading(T, pre); //线索化二叉树
pre->rchild = NULL; //处理到了最后一个结点,pre指向最后一个结点,右孩子设为空表示最后一个结点
pre->RTag = 1; //表示指针
}
}