#include<iostream.h>
#include<malloc.h>
typedef enum pointertag{link,thread};//link==0:指针,threak==1:线索
typedef struct bithrnode
{
char data;
struct bithrnode *lchild,*rchild;//左右孩子指针
pointertag ltag,rtag; //左右标志
} bithrnode,*bithree;
bithrnode *pre;
//bithree &thrt;
char Createbithree(bithree &p)
{ char ch;
cin>>ch;
if (ch=='#') p= NULL;
else
{
if (!(p = new bithrnode))
return 1;
p->data = ch; // 生成根结点
Createbithree(p->lchild); // 构造左子树
Createbithree(p->rchild); // 构造右子树
}
//return 0;
} // CreateBiTree
//中序线索化
void inthreading(bithree 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; //保持pre始终指向p的前驱
inthreading(p->rchild); //右子树线索化
}
}
//中序遍历中序线索化链表
char inorderthreding(bithree p,bithree &thrt)
{
if(!(thrt=(bithrnode *)malloc(sizeof(bithrnode))))
return 1;
thrt->ltag=link;
thrt->rtag=thread;
thrt->rchild=thrt; //建立头结点
if(p)
thrt->lchild=thrt; //如果二叉树为空,则左指针回指
else
{
thrt->lchild=p;
pre=thrt;
inthreading(p); //中序遍历进行中序线索化
pre->rchild=thrt;
pre->rtag=thread;
thrt->rchild=pre;
}
return 0;
}
void printbithree(bithree &p)
{
if(p)
{
printbithree(p->lchild);
cout<<p->data<<endl;
printbithree(p->rchild);
}
return;
}
int main()
{
bithree S=NULL,thrt=NULL;
cout<<"创建二叉树"<<endl;
Createbithree(S);
cout<<"中序线索化"<<endl;
inorderthreding(S,thrt);
cout<<"输出"<<endl;
printbithree(S);
return 0;
}