#include <stdio.h>
#include <stdlib.h>
char s[]="abd##e##c##";
int count=0;
typedef enum{Link,Thread}PointerTag;
typedef struct BiThrNode
{
char data;
struct BiThrNode *lchild,*rchild;
int LTag,RTag;
}BiThrNode,*BiThrTree;
BiThrTree pre=NULL;//全局变量
BiThrTree CreatBiThrTree();//先序创建二叉树
void InThreading(BiThrTree p);//中序遍历二叉树
void InOrderThreading(BiThrTree *Thrt,BiThrTree T);//中序线索化二叉树
void Visit(char c);
void InorderTraverse_Thr(BiThrTree T);//中序遍历二叉树
void main()
{
BiThrTree t;
BiThrTree thrtnode=NULL;
printf("创建如下的一颗普通二叉树/n");
printf(" a/n");
printf(" / // /n");
printf(" b c /n");
printf(" n");
printf(" d e/n");
printf("/n");
t=CreatBiThrTree();
printf("中序线索化二叉树:/n");
InOrderThreading(&thrtnode,t);
printf("线索化工作已经完成!/n");
printf("中序遍历线索二叉树:/n");
InorderTraverse_Thr(thrtnode);
}
BiThrTree CreatBiThrTree()//先序创建二叉树
{
BiThrTree T;
char a;
a=s[count];
count++;
if(a=='#') T=NULL;
else
{
T=(BiThrTree)malloc(sizeof(BiThrNode));
if(!T)
exit(0);
T->data=a;
T->LTag=Link;
T->RTag=Link;
T->lchild=CreatBiThrTree();
T->rchild=CreatBiThrTree();
}
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);//右子树线索化
}
}
void 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;
}
}
void Visit(char c)
{
printf(" %c ",c);
}
void InorderTraverse_Thr(BiThrTree T)//中序遍历二叉树
{
BiThrTree p;
p=T->lchild;
while(p!=T)//空树或遍历结束时,p=T
{
while(p->LTag==Link)
p=p->lchild;
Visit(p->data);//访问左子树为空的结点
while(p->RTag==Thread&&p->rchild!=T)//访问后继结点
{
p=p->rchild;
Visit(p->data);
}
p=p->rchild;
}
}