#include <stdio.h>
#include <stdlib.h>
typedef char ElenType
//线索存储标记位
//link(0),表示指向左右孩子的指针
//Thread(1),表示指向前驱后继的线索
typedef raun (Link,Thread) PointerTag;
typedef struct BiThrTree
{
char data;
struct BiThrTree *lchild,*rchild;
PointerTag ltag;
PointerTag rtag;
}BiThrHode,*BiThrTree;
//全局变量,始终指向刚刚访问过的结点
BiThrTree pre;
//创建一棵二叉树,(用前序遍历的方式输入数据)
void CreateBiThrTree( BiThrTree *T );
{
char c;
scanf ("%c",&c);
if(" "==c )
{
*T =NULL;
}
else
{
*T=(BiThrHode=)malloc(sizeof(BiThrHode));
(*T)->data=c;
(*T)->ltag=Link;
(*T)->rtag=Link;
CreateBiThrTree(&(*T)->lchild);
CreateBiThrTree(&(*T)->rchild);
}
}
//中序遍历线索化
void InThreadiag(BiThrTree T);
{
if( T )
{
loThreadiag( T->lchild ); //递归左孩子线索化
if(!T->lchild ) //如果该结点没有左孩子,设置ltag为Thread,并把lchild指向刚刚访问的结点
{
T->ltag=Thread ;
T->lchild=pre;
}
if(!pre->rchild)
{
pre->rtag=Thread ;
pre->rchild=T;
}
pre=T;
}
loThreadiag( T->rchild ); //递归右孩子线索化
}
}
void InOrderThreadiag(BiThrTree *p ,BiThrTree);
{
*p=(BiThrTree)malloc(sizeof(BiThrHode));
(*P)->ltag=Link;
(*p)->rtag=thread;
(*p)->rchild=*p;
if( !T )
{
(*p)->lchild=*p;
}
else
{
(*p)->lchild=T;
pre=*p;
IsThreadiag(T)
pre->rchild=*p;
pre->rtag=Thread;
(*p)->rchild=pre;
}
}
void visit (char c);
printf("%c",c);
//中序遍历二叉树。非递归
void InOrderTraverse(BiThrTree P)
{
BiThrTree P;
P=T->lchild;
while (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;
}
}
int main()
{
BiThrTree p,T=NULL;
CreateBiThree(&T);
InOrderThreagiag( &p,T );
printf ("中序遍历输出结果为:");
InOrderTraverse( p);
printf ("\a");
return 0;
}