先序,中序,后序遍历非递归算法

#include<bits/stdc++.h>

#define MaxSize 100

typedef struct node

{

 char data;

 struct node *lchild,*rchild;

}BTNode;

typedef struct 

{

 BTNode *data[MaxSize];

 int top;

扫描二维码关注公众号,回复: 15160251 查看本文章

}SqStack;

void Greate(BTNode *&T)

{

 char ch;

 scanf("%c",&ch);

 if(ch=='#') T=NULL;

 else 

 {

  T=(BTNode*)malloc(sizeof(BTNode));

  T->data=ch;

  Greate(T->lchild);

  Greate(T->rchild);

 }

}

//初始化 

void InitStack(SqStack *&s)

{

    s=(SqStack *)malloc(sizeof(SqStack));

    s->top=-1;

}

//入栈

bool Push(SqStack *&s, node *e)

{

    if(s->top==MaxSize-1)

    {

        return false;

    }

    s->top++;

    s->data[s->top]=e;

    return true;

//销毁栈

void Destory(SqStack *&s) 

{

 free(s);

}

bool StackEmpty(SqStack *s)

{

 return(s->top==-1);

}

//出栈

bool Pop(SqStack *&s,node *&e)

{

    if(s->top==-1)

    {

        return false;

    }

    e=s->data[s->top];

    s->top--;

    return true;

//取栈顶元素

bool GetTop(SqStack *s,node *&e) 

{

 if(s->top==-1) return false;

 e=s->data[s->top];

 return true;

}

//先序遍历两种非递归算法 

void PreOrder1(BTNode *T)

{

 BTNode *p;

 SqStack *st;

 InitStack(st);

 if(T!=NULL)

 {

  Push(st,T);

  while(!StackEmpty(st))

  {

   Pop(st,p);

   printf("%c",p->data);

   if(p->rchild!=NULL) Push(st,p->rchild);

   if(p->lchild!=NULL) Push(st,p->lchild);

  }

  printf("\n");

 }

 Destory(st);

}

void PreOrder2(BTNode *T)

{

 BTNode *p;

 SqStack *st;

 InitStack(st);

 p=T;

 while(!StackEmpty(st) || p!=NULL)

 {

  while(p!=NULL)

  {

   printf("%c",p->data);

   Push(st,p);

   p=p->lchild;

  }

  if(!StackEmpty(st))

  {

   Pop(st,p);

   p=p->rchild;

  }

 }

 printf("\n");

 Destory(st);

}

//中序遍历两种非递归算法

void InOrder(BTNode *T)

{

 BTNode *p;

 SqStack *st;

 InitStack(st);

 p=T;

 while(!StackEmpty(st) || p!=NULL)

 {

  while(p!=NULL)

  {

   Push(st,p);

   p=p->lchild;

  }

  if(!StackEmpty(st))

  {

   Pop(st,p);

   printf("%c",p->data);

   p=p->rchild;

  }

 }

 printf("\n");

 Destory(st);

}

//后序遍历非递归算法

void PostOrder(BTNode *T)

{

 BTNode *p,*r;

 bool flag;

 SqStack *st;

 InitStack(st);

 p=T;

 do

 {

  while(p!=NULL)

  {

   Push(st,p);

   p=p->lchild;

  }

  r=NULL;

  flag=true;

  while(!StackEmpty(st) && flag)

  {

   GetTop(st,p);

   if(p->rchild==r)

   {

    printf("%c",p->data);

    Pop(st,p);

    r=p;

   }

   else

   {

    p=p->rchild;

    flag=false;

   }

  }

 }while(!StackEmpty(st));

 printf("\n");

 Destory(st);

int main()

{

 BTNode *T;

 Greate(T);

 PreOrder1(T);

 PreOrder2(T);

 InOrder(T);

 PostOrder(T);

 return 0;

}

猜你喜欢

转载自blog.csdn.net/2302_77099705/article/details/130909687