//输入只有一行,包含一个字符串S,用来建立二叉树。保证S为合法的二叉树先序遍历字符串,节点内容只有大写字母,且S的长度不超过100。
//共一行,包含一串字符,表示按中序遍历二叉线索树得出的节点内容,每个字母后输出一个空格。请注意行尾输出换行。
//例如;ABC DE G F
#include<stdio.h>
#include<stdlib.h>
typedef struct {
char ch;
}ElemType;
typedef enum {Link,Thread} PointerTag;
typedef struct BiTNode{
ElemType elem;
struct BiTNode *Lchild;
struct BiTNode *Rchild;
PointerTag LTag;
PointerTag RTag;
}BiTNode,*BiTree;
BiTree pre;
void CreatTree(BiTree *T);
void InOrderThreading(BiTree *Thrt,BiTree T);
void InThreading(BiTree p);
void InOrderTraverse(BiTree T);
void Z_Traverse(BiTree T);
int main()
{
BiTree T;
CreatTree(&T);
BiTree Thrt;
InOrderThreading(&Thrt,T);//中序线索化
InOrderTraverse(Thrt);//中序遍历
}
void CreatTree(BiTree *T)//前序遍历建立二叉树
{
char a;
scanf("%c",&a);
if(a==' ')
{
*T=NULL;
}
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
(*T)->elem.ch=a;
(*T)->LTag=Link;//初始化
(*T)->RTag=Link;//初始化
CreatTree( &( (*T)->Lchild ) );
CreatTree( &( (*T)->Rchild ) );
}
}
void InOrderThreading(BiTree *Thrt,BiTree T)
{
(*Thrt) = (BiTree)malloc(sizeof(BiTNode));
(*Thrt)->Rchild=*Thrt;//右指针回指
(*Thrt)->RTag=Link;//初始化
if(!T)//如果树是空 左指针也回指
{
(*Thrt)->Lchild=*Thrt;
(*Thrt)->LTag=Link;
}
else
{
pre=*Thrt;
(*Thrt)->Lchild=T;
(*Thrt)->LTag=Link;
InThreading(T);//线索化
pre->Rchild=*Thrt;
pre->RTag=Thread;
(*Thrt)->Rchild=pre;
}
}
void InThreading(BiTree 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;
InThreading(p->Rchild);
}
}
void InOrderTraverse(BiTree T)//遍历线索化二叉树
{
BiTree p;
p=T->Lchild;
while(p!=T)
{
while(p->LTag==Link)//找到第一个左孩子为空的节点
{
p=p->Lchild;
}
printf("%c ",p->elem.ch);
while(p->RTag==Thread&&p->Rchild!=T)//线索不为空&&不是最后一个节点
{
p=p->Rchild;//根据线索遍历
printf("%c ",p->elem.ch);
}
p=p->Rchild;//转到右子树
}
}