中序二叉树:
#include<stdlib.h>
#include<stdio.h>
#define maxs 100
typedef char datatype;
typedef enum pointertag{link,thread};
typedef struct tree //线索二叉树
{
datatype data;
struct tree *lchild,*rchild;
enum pointertag ltag,rtag;
}tnode;
tnode *creat(tnode *p) //先序创建二叉树
{
datatype ch;
scanf("%c",&ch);
if(ch==' ')
p=NULL;
else
{
if(!(p=(tnode*)malloc(sizeof(tnode))))
{
printf("error!\n");
exit(0);
}
p->data=ch;
p->ltag=0;
p->rtag=0;
p->lchild=creat(p->lchild);
p->rchild=creat(p->rchild);
}
return p;
}
tnode *inorder(tnode *thrt,tnode *p) //非递归遍历二叉树,并将其中序线索化
{
tnode *stack[maxs],*s;
tnode *pre;
int top=0;
int flag=1;
s=p;
if(!(thrt=(tnode*)malloc(sizeof(tnode)))) //建立头节点
{
printf("error!\n");
exit(0);
}
thrt->ltag=0;
thrt->rtag=1;
thrt->rchild=thrt;
pre=thrt;
if(!p)
{
thrt->lchild=thrt;
flag=0;
}
do{
while(s!=NULL)
{
top++;
stack[top]=s;
s=s->lchild;
}
if(top>0)
{
s=stack[top];
top--;
if(!s->lchild) //前驱线索
{
s->ltag=thread;
s->lchild=pre;
}
if(!pre->rchild) //后继线索
{
pre->rtag=thread;
pre->rchild=s;
}
pre=s; //pre指向其前驱
s=s->rchild;
}
if(s==NULL&&top==0&&flag==1) //do...while先做一次循环,再判断条件,
{ //flag用于非空树进行线索化的条件判断
thrt->lchild=p;
pre->rchild=thrt;
pre->rtag=1;
thrt->rchild=pre;
}
}while(s!=NULL||top>0);
return thrt;
}
void show(tnode *p) //遍历中序二叉树
{
tnode *s;
if(p->rchild==p)
printf("empty tree\n");
s=p->lchild;
while(s!=p)
{
while(s->ltag==link)
{
s=s->lchild;
}
printf("%c ",s->data);
while(s->rtag==thread&&s->rchild!=p)
{
s=s->rchild;
printf("%c ",s->data);
}
s=s->rchild;
}
printf("\n");
}
int main()
{
tnode *p,s;
tnode *m,n;
p=&s;
m=&n;
p=creat(p);
m=inorder(m,p);
show(m);
system("pause");
return 0;
}