#include <stdio.h>
#include <stdlib.h>
typedef struct BiThrNode
{
char data;
int ltag,rtag;
struct BiThrNode *lchild,*rchild;
}BiThrNode,*BiThrTree;
void InitTree(BiThrTree *T,char a);
void CreateTree(BiThrTree *T);
void Inorder(BiThrTree T);
void visit(BiThrTree T);
void CreateInthread(BiThrTree *T);
void Inthread(BiThrTree *T,BiThrTree *Pre);
void FirstNode(BiThrTree T);
int NextNode(BiThrTree T,char x);
void DestroyTree(BiThrTree *T);
int main()
{
BiThrTree T;
char x;
printf("开始创建二叉树\n(以输入#为结束)\n请输入数据:");
CreateTree(&T);
printf("\n中序遍历为:");
Inorder(T);
CreateInthread(&T);
printf("\n\n中序线索二叉树中中序序列下的第一个结点为:");
FirstNode(T);
printf("\n\n请输入要查找的数据的值:");
scanf("%s",&x); //有没有大佬知道为何在这句代码为字符变量x赋值后,会导致二叉树T被清空
printf("\n中序线索二叉树中值为%c的结点在中序序列下的后继结点为:",x);
NextNode(T,x);
DestroyTree(&T);
}
void InitTree(BiThrTree *T,char a)
{
*T=(BiThrTree)malloc(sizeof(BiThrNode));
(*T)->data=a;
(*T)->ltag=(*T)->rtag=0;
(*T)->lchild=(*T)->rchild=NULL;
}
void CreateTree(BiThrTree *T)
{
char a;
scanf("%s",&a);
if(a!='#')
{
InitTree(T,a);
CreateTree(&(*T)->lchild);
CreateTree(&(*T)->rchild);
}
else
*T=NULL;
}
void Inorder(BiThrTree T)
{
if(T)
{
Inorder(T->lchild);
visit(T);
Inorder(T->rchild);
}
}
void visit(BiThrTree T)
{
printf("%c",T->data);
}
void CreateInthread(BiThrTree *T)
{
BiThrTree Pre=NULL;
if(*T)
{
Inthread(T,&Pre);
Pre->rtag=1;
}
}
void Inthread(BiThrTree *T,BiThrTree *Pre)
{
if(*T)
{
Inthread(&(*T)->lchild,Pre);
if((*T)->lchild==NULL)
{
(*T)->ltag=1;
(*T)->lchild=*Pre;
}
if((*Pre)!=NULL&&(*Pre)->rchild==NULL)
{
(*Pre)->rtag=1;
(*Pre)->rchild=*T;
}
*Pre=*T;
Inthread(&(*T)->rchild,Pre);
}
}
void FirstNode(BiThrTree T)
{
while(T->ltag==0)
T=T->lchild;
visit(T);
}
int NextNode(BiThrTree T,char x)
{
int i=0;
if(T)
{
if(T->data==x)
{
if(T->rtag==1)
{
visit(T->rchild);
return 1;
}
else
{
T=T->rchild;
while(T->ltag==0)
T=T->lchild;
visit(T);
return 1;
}
}
else
{
if(T->ltag==0)
i=NextNode(T->lchild,x);
if(i==0)
{
if(T->rtag==0)
NextNode(T->rchild,x);
else
return 0;
}
}
}
else
return 0;
}
void DestroyTree(BiThrTree *T)
{
if(*T!=NULL)
{
DestroyTree(&(*T)->lchild);
DestroyTree(&(*T)->rchild);
free(*T);
}
}