#include <stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef char TElemType;
typedef int status;
typedef enum PointerTag{Link,Thread}; //Link==0:指针,Thread==1:线索
//二叉线索树的存储结构
typedef struct BithrNode
{
TElemType data;
BithrNode *lchild ,*rchild;
PointerTag LTag,RTag;
} BiThrNode,*BiThrTree;
//全局变量
BiThrTree pre=NULL;
//先序创建二叉树,并以"#"表示当前结点为NULL;
BiThrTree Create()
{
BiThrTree T;
TElemType ch;
ch=getchar();
if(ch=='#') T=NULL;
else
{
if(!(T=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(0);
T->data=ch;T->LTag=Link;T->RTag=Link;
T->lchild= Create();
T->rchild= Create();
}
return T;
}
void InThreading(BiThrTree p)
{
if(p)
{
InThreading(p->lchild);
if(!p->lchild)
{
p->LTag=Thread;
p->lchild=pre;
} //建立前驱线索
if(!pre->rchild)
{
pre->RTag=Thread;
pre->rchild=p;
} //建立后继线索
pre=p; //保持pre是p的前驱
InThreading(p->rchild);
}
}
//中序线索化二叉树
status InOrderThreading(BiThrTree &Thrt,BiThrTree T)
{
if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(0);
Thrt->LTag=Link; Thrt->RTag=Thread;
Thrt->rchild=Thrt;
if(!T) Thrt->lchild=Thrt;
else
{
Thrt->lchild=T;
pre=Thrt;
InThreading(T);
pre->rchild=Thrt;pre->RTag=Thread;
Thrt->rchild=pre;
}
return 1;;
}
//线索遍历二叉树
status InOrderTraverse_Thr(BiThrTree T)
{
if(!T) return 0;
BiThrTree p=T->lchild;
while(p!=T)
{
while(p->LTag==Link) { p=p->lchild;}
printf("%c ",p->data);
while(p->RTag==Thread && p->rchild!=T) //P为最后一个结点时候那么他的后继结点一定要与头结点判断,
//若改成p!=T那变成了一个死循环不断输出头结点和最后访问结点的值
{
p=p->rchild;
printf("%c ",p->data);
}
p=p->rchild;
}
return 1;
}
void main()
{
BiThrTree T,Thrt;
T=Create();
if(InOrderThreading(Thrt,T))
if(InOrderTraverse_Thr(Thrt))
printf("/nThe Test is End") ;
}