先序二叉树:
#include<stdlib.h> //先序线索二叉树的建立和遍历
#define maxs 100
typedef char datatype;
typedef struct node
{
datatype data;
struct node *rchild,*lchild;
int 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->rtag=0;
p->ltag=0;
p->lchild=creat(p->lchild);
p->rchild=creat(p->rchild);
}
return p;
}
tnode *prorder(tnode *thrt,tnode *p) //先序遍历并线索化
{
tnode *s,*stack[maxs];
tnode *pre,*m; //pre指向后继,m指向前驱
int top=0,flag=1;
if(!(thrt=(tnode*)malloc(sizeof(tnode)))) //建立头节点
{
printf("error!\n");
exit(0);
}
thrt->ltag=0;
thrt->rtag=1;
thrt->rchild=thrt; //右指针回指
m=thrt;
if(!p) //空树,左指针回指
{
thrt->lchild=thrt;
flag=0;
}
else
{
top++;
stack[top]=p;
while(top>0)
{
s=stack[top];
top--;
if(s->rchild!=NULL) //栈先进后出,右子树先进,左子树后进
{
top++;
stack[top]=s->rchild;
pre=s->rchild;
}
if(s->lchild!=NULL)
{
top++;
stack[top]=s->lchild;
pre=s->lchild;
}
if(s->rchild==NULL&&s->lchild==NULL) //pre指向后继
pre=NULL;
if(pre==NULL&&top>0) //左右子树均为空且不为最后一个节点,右孩子指针域
{ //指向下一个节点
s->rchild=stack[top];
s->rtag=1;
s->lchild=m;
s->ltag=1;
}
if(pre==s->rchild) //左子树不存在,右子树存在,右孩子即为其后继
{
s->lchild=m;
s->ltag=1;
s->rtag=1;
}
if(pre==s->lchild&&s->rchild==NULL) //左子树存在,右子树不存在,右子树指
{ //向后继
s->rtag=1;
s->rchild=pre;
}
if(flag==1&&top==0) //最后一个节点线索化
{
thrt->lchild=p;
s->lchild=m;
s->ltag=1;
s->rchild=thrt;
s->rtag=1;
thrt->rchild=s;
}
m=s;
}
}
return thrt;
}
void show(tnode *p)
{
tnode *s;
if(p->rchild==p)
{
printf("empty tree!\n");
exit(0);
}
s=p->lchild;
printf("%c ",s->data);
while(s!=p)
{
if(s->ltag==0) //左子树存在,左子树为其后继
{
s=s->lchild;
printf("%c ",s->data);
}
else if(s->rtag==0) //左子树不存在,右子树存在,右子树为其后继
{
s=s->rchild;
printf("%c ",s->data);
}
else //左右均不存在
{
s=s->rchild;
if(s->rchild==p) //指向头节点时,退出
{
printf("\n");
return ;
}
printf("%c ",s->data);
}
}
printf("\n");
}
int main()
{
tnode *p,s;
tnode *m,n;
p=&s;
m=&n;
p=creat(p);
m=prorder(m,p);
show(m);
system("pause");
return 0;
}