#include <stdio.h>
#include <malloc.h>
#define ERROR 0
#define OK 1
typedef char TElemType;
typedef enum PointerTag{Link,Thread};
typedef struct BiThrNode{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThrTree;
BiThrTree pre;
void InOrderTraverse_Thr(BiThrTree T)
{
BiThrNode *p;
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->rchild;printf("%c",p->data);
}
p=p->rchild;
}
}
void InThreading(BiThrTree p)
{
if(p)
{InThreading(p->lchild);
if(!p->lchild)
{p->LTag=Thread;p->lchild=pre;}
else p->LTag=Link;
if(!p->rchild) p->RTag=Thread; else p->RTag=Link;
if(!pre->rchild)
{pre->RTag=Thread;pre->rchild=p;}
else p->RTag=Link;
pre=p;
InThreading(p->rchild);
}
}
int InOrderThreading(BiThrTree &Thrt,BiThrTree T)
{
if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) return ERROR;
Thrt->LTag=Link; Thrt->rchild=Thrt;
if(!T) {Thrt->lchild=Thrt;Thrt->RTag=Thread;}
else
{Thrt->lchild=T; pre=Thrt;
InThreading(T);
pre->rchild=Thrt;
pre->RTag=Thread;Thrt->rchild=pre;
}
return OK;
}
void CreateBiThrTree(BiThrTree &T)
{
char x;
scanf("%c",&x);
if(x=='*')T=NULL;
else
{
T=(BiThrNode *)malloc(sizeof(BiThrNode));
T->data=x;
CreateBiThrTree(T->lchild);
CreateBiThrTree(T->rchild);
}
}
int main(int argc,char*argv[])
{
BiThrTree ThrTree,h;
printf("按先序次序输入字符序列,空格表示空树:\n");
CreateBiThrTree(ThrTree);
InOrderThreading(h,ThrTree);
printf("二叉线索链表构建完成!\n");
printf("二叉线索树中序遍历结果:\n");
InOrderTraverse_Thr(h);
printf("\n");
return 0;
}