先序二叉树非递归的建立与遍历

先序二叉树:

#include<stdlib.h>     //先序线索二叉树的建立和遍历

#include<stdio.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;

}


猜你喜欢

转载自blog.csdn.net/fight_snail/article/details/80139885
今日推荐