#include<iostream>
#include<windows.h>
using namespace std;
typedef char TElemType ;
typedef enum PointerTag{Link,Thread};
typedef struct BiThrNode{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThrTree;
void CreatTree(BiThrTree &T)
{
TElemType item;
cin>>item;
if(item=='#')
T=NULL;
else
{
if(!(T=new BiThrNode))
{exit(0);}
T->data=item;
T->LTag=PointerTag(0);
T->RTag=PointerTag(0);
CreatTree(T->lchild);
CreatTree(T->rchild);
}
}
void InOrderTraverse(BiThrTree T)//遍历
{
BiThrTree p;
p=T->lchild;
while(p!=T)
{
while(p->LTag==Link)
p=p->lchild;
if(p!=NULL)
cout<<p->data<<'\t';
while(p->RTag==Thread&&p->rchild!=T)
{
p=p->rchild;
cout<<p->data<<'\t';
}
p=p->rchild;
}
}
void InThreading(BiThrTree p,BiThrTree &pre)//中序遍历进行线索化
{
if(p!=NULL)
{
InThreading(p->lchild,pre);
if(p->lchild==NULL)
{
p->LTag=Thread;
p->lchild=pre;
}
if(pre->rchild==NULL)
{
pre->RTag=Thread;
pre->rchild=p;
}
pre=p;
InThreading(p->rchild,pre);
}
}
void InOrderThreading(BiThrTree &Thrt,BiThrTree T)//Thrt指向头结点
{
if(!(Thrt=new BiThrNode))
exit(0);
Thrt->LTag=Link;
Thrt->RTag=Thread;
Thrt->rchild=Thrt;
BiThrTree pre;
if(!T)
Thrt->lchild=Thrt;
else
{
Thrt->lchild=T;
pre=Thrt;
InThreading(T,pre);
pre->rchild=Thrt;
pre->RTag=Thread;
Thrt->rchild=pre;
}
}
BiThrNode *First(BiThrTree T)//函数返回以T为根中序线索二叉树中中序序列下的第一个结点
{
for(BiThrTree p=T;!p->LTag;p=p->lchild);
return p;
}
BiThrNode *Last(BiThrTree T)
{
for(BiThrTree p=T;!p->RTag;p=p->rchild);//函数返回以T为根中序线索二叉树最后一个结点
return p;
}
BiThrNode *Next(BiThrTree T)//结点T的后继结点
{
if(T->RTag)
return T->rchild;
else
return(First(T->rchild));
}
BiThrNode *Prior(BiThrTree T)//结点T的前驱结点
{
if(T->LTag)
return T->lchild;
else
return(Last(T->lchild));
}
void main()
{
BiThrTree T,Thrt,p;
cout<<"前序建立二叉树('#'代表空树)"<<endl;
CreatTree(T);
cout<<"再在进行中序线索化......"<<endl;
//Sleep(4000);
InOrderThreading(Thrt,T);
cout<<"中序遍历线索化二叉树"<<endl;
InOrderTraverse(Thrt);
cout<<endl;
p=First(Thrt->lchild);
cout<<"第一个结点"<<p->data<<endl;
p=Last(Thrt->lchild);
cout<<"最后一个结点"<<p->data<<endl;
p=Next(Thrt->lchild);
cout<<"后继结点"<<p->data<<endl;
p=Prior(Thrt->lchild);
cout<<"前驱结点"<<p->data<<endl;
system("pause");
}
/*
ABD##E##C##
*/