中序二叉树的建立与遍历

中序二叉树:

#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;
}

猜你喜欢

转载自blog.csdn.net/fight_snail/article/details/80139908