#include"stdio.h"
#include"malloc.h"
typedef struct BiTNode{
char data; //根结点
struct BiTNode *lchild,*rchild;//左右孩子指针
int LTag,RTag; //左右标志
}BiTNode,*BiTree;
BiTree pre;
char *ch="abc##de#g##f###";
int i=0;
int CreateBiTree(BiTree &T){ //先序构造树
if(ch[i]=='#') {T=NULL; i++;}
else
{
T=(BiTree)malloc(sizeof(BiTNode));//生成新结点
if(!T) return -1; //分配失败
T->data=ch[i++]; //生成根结点
T->LTag=0; T->RTag=0; //左右标志初始化
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
return 1;
}
/*void Preorder(BiTree T){ //中序遍历树
if(T->lchild) Preorder(T->lchild); //遍历左子树
if(T->data) printf("%c",T->data);
if(T->rchild) Preorder(T->rchild); //遍历右子树
}*/
void InThreading(BiTree p){
if(p){
InThreading(p->lchild);
if(!p->lchild){p->LTag=1;p->lchild=pre;}
if(!pre->rchild){pre->RTag=1;pre->rchild=p;}
pre=p;
InThreading(p->rchild);
}
}
int InOrderThreading(BiTree &Thrt,BiTree T){
Thrt=(BiTree)malloc(sizeof(BiTNode));
if(!Thrt) return -1;
Thrt->LTag=0;
Thrt->RTag=1; Thrt->rchild=Thrt;
if(!T) Thrt->lchild=Thrt;
else{
Thrt->lchild=T; pre=Thrt;
InThreading(T);
pre->RTag=1;
pre->rchild=Thrt;
Thrt->rchild=pre;
}
return 1;
}
int InOrderTraverse(BiTree S){
BiTree q=S->lchild;
while(q!=S){
while(q->LTag==0){q=q->lchild;}
printf("%c",q->data);
while(q->RTag==1&&q->rchild!=S){
q=q->rchild; printf("%c",q->data);
}
q=q->rchild;
}
return 1;
}
void main(){
BiTree T,Thrt;
CreateBiTree(T);
InOrderThreading(Thrt,T);
InOrderTraverse(Thrt);
//Preorder(T);
}