#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct BiThrNode{
char data;
struct BiThrNode *lchild,*rchild;
int ltag,rtag;//0为左右子树,1为线索
}BiThrNode,*BiThrTree;
BiThrTree pre;
char preoder[101];
int index=0;
void create(BiThrTree *t){
if (preoder[index]==' ')
{
index++;
*t=NULL;
return ;
}else{
*t=(BiThrTree)malloc(sizeof(BiThrNode));
(*t)->data=preoder[index];
index++;
create(&(*t)->lchild);
create(&(*t)->rchild);
}
}
void inthreading(BiThrTree t){
if (t)
{
inthreading(t->lchild);
if (t->lchild)
{
t->ltag=0;
}else{
t->ltag=1;
t->lchild=pre;
}
if (pre->rchild)
{
pre->rtag=0;
}else{
pre->rtag=1;
pre->rchild=t;
}
pre=t;
inthreading(t->rchild);
}
}
void inorderthreading(BiThrTree t,BiThrTree *thrt){
*thrt=(BiThrTree)malloc(sizeof(BiThrNode));
(*thrt)->rtag=1;
(*thrt)->rchild=*thrt;//右线索先回指,最后再把它指向最后一个节点
(*thrt)->ltag=0;//ltag和rtag是确定的
if (!t)
{
(*thrt)->lchild=(*thrt);
}else{
(*thrt)->lchild=t;
pre=*thrt;//记录下头结点
inthreading(t);//中序遍历进行中序线索化
//最后一个节点线索化
pre->rtag=1;
pre->rchild=(*thrt);
(*thrt)->rtag=1;
(*thrt)->rchild=pre;//头结点线索化
}
}
void inoder_thr(BiThrTree thrt){
BiThrTree p=thrt->lchild;
while (p!=thrt)
{
while (p->ltag==0)
{
p=p->lchild;
}
printf("%c ",p->data);
while (p->rtag==1&&p->rchild!=thrt)
{
p=p->rchild;
printf("%c ",p->data);
}
p=p->rchild;
}
printf("\n");
}
void print(BiThrTree t){
if (t)
{
print(t->lchild);
printf("%c ",t->data);
print(t->rchild);
}
}
void clean_thr(BiThrTree thrt){
if (thrt)
{
if (thrt->ltag==0)
{
thrt->ltag=1;//否则会重复
clean_thr(thrt->lchild);
}
if (thrt->rtag==0)
{
thrt->rtag=1;//
clean_thr(thrt->rchild);
}
free(thrt);
}
}
void clean(BiThrTree t){
if (t)
{
clean(t->lchild);
clean(t->rchild);
free(t);
}
}
int main(){
BiThrTree t,thrt;
// freopen("1.txt","r",stdin);
while (scanf("%[^\n]",preoder)!=EOF)
{
index=0;
create(&t);
// print(t);
// printf("\n");
inorderthreading(t,&thrt);
// print(t);
// printf("\n");
inoder_thr(thrt);
clean_thr(thrt);
getchar();
}
// fclose(stdin);
return 0;
}
/**************************************************************
Problem: 2155
User: admin
Language: C
Result: Accepted
Time:11 ms
Memory:1148 kb
****************************************************************/