#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef int Status;
typedef char TElemType;
typedef enum {Link,Thread} PointerTag;
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
} BiThrNode,*BiThrTree;
Status CreateBiThrTree(BiThrTree &T)
{
char ch;
scanf("%c",&ch);
if(ch==' ')
T=NULL;
else
{
if(!(T=(BiThrNode *)malloc(sizeof(BiThrNode))))
exit(OVERFLOW);
T->data=ch;
T->LTag=T->RTag=Link;
CreateBiThrTree(T->lchild);
CreateBiThrTree(T->rchild);
}
return OK;
}
Status PrintElement(TElemType e)
{
printf("%c ",e);
return OK;
}
BiThrTree pre;
void InThreading(BiThrTree 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);
}
}
Status InOrderTraverse_Thr(BiThrTree T,Status(*visit)(TElemType e))
{
BiThrTree p;
p=T->lchild;
while(p!=T)
{
while(p->LTag==Link)
p=p->lchild;
if(!visit(p->data))
return ERROR;
while(p->RTag==Thread&&p->rchild!=T)
{
p=p->rchild;
visit(p->data);
}
p=p->rchild;
}
printf("\n");
return OK;
}
Status InOrderThreading(BiThrTree &Thrt,BiThrTree T)
{
if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode))))
exit(OVERFLOW);
Thrt->LTag=Link;
Thrt->RTag=Thread;
Thrt->rchild=Thrt;
if(!T)
Thrt->lchild=Thrt;
else
{
Thrt->rchild=T;
pre=Thrt;
InThreading(T);
pre->rchild=Thrt;
pre->RTag=Thread;
Thrt->rchild=pre;
}
return OK;
}
int main()
{
BiThrTree T,Thrt;
CreateBiThrTree(T);
InOrderThreading(Thrt,T);
InOrderTraverse_Thr(Thrt,PrintElement);
return 0;
}
线索二叉树的遍历(数据结构)
最新推荐文章于 2022-11-23 21:47:33 发布