二叉树的非递归前中后遍历

#include <stdio.h>
#include <stdlib.h>
#define maxn 1000
struct  Tnode
{
     int data;
     struct Tnode* left;
     struct Tnode* right;

};
typedef struct Tnode* Btree;
Btree creat()//µÝ¹é½¨Á¢¶þ²æÊ÷
{
    int data;
    scanf("%d",&data);
    Btree root;
    if(data!=-1)
    {
         root=(Btree)malloc(sizeof(struct Tnode));
         root->data=data;
         root->left=creat();
         root->right=creat();

    }
    else
       return NULL;
    return  root;
}
void preorder(Btree root)
{
    Btree* zhan[maxn];
    int top=-1;
    if(root!=NULL)
    {
      zhan[++top]=root;
       while(top!=-1)
       {
          Btree temp=zhan[top--];
          printf("%d ",temp->data);
          if(temp->right!=NULL)
         {
          zhan[++top]=temp->right;
         }
       if(temp->left!=NULL)
         {
          zhan[++top]=temp->left;

         }



       }
    }


}
void inorder(Btree root)
{
    Btree *zhan[maxn];
    int top=-1;
    Btree p=root;
    if(root!=NULL)
{
     while(p!=NULL||top!=-1)
     {

         while(p!=NULL)  //从某一个结点起一直压栈知道它没有左孩子
       {
             zhan[++top]=p;
             p=p->left;

       }
       if(top!=-1)//当上一结点不存在左孩子这个时候可以弹栈了
       {
              Btree temp=zhan[top--];
          printf("%d ",temp->data);
          if(temp->right!=NULL)   //当弹栈的元素有右子树的时候要优先输出 因为以弹栈结点为整体的这个树理论上算是一个左树需要优先遍历
          {
                p=temp->right;
          }

       }
    }








}


}
void postorder(Btree root)
{
   Btree stack1[maxn];
   int  stack2[maxn];
   int top1=-1,top2=-1;
   if(root)
   {
       stack1[++top1]=root;
       while(top1!=-1)
       {
              Btree temp=stack1[top1--];
              stack2[++top2]=temp->data;
              if(temp->left!=NULL)
              {
                  stack1[++top1]=temp->left;
              }
              if(temp->right!=NULL)
              {
                  stack1[++top1]=temp->right;
              }



       }
     while(top2!=-1)
       {
            printf("%d ",stack2[top2--]);

       }

   }

}
int main()
{
    Btree root=NULL;//
    root=creat();  //1 2 4 -1 -1 5 6 7 -1 -1 -1 -1 3 -1 -1

   preorder(root);
   printf("\n");
   inorder(root);
   printf("\n");
   postorder(root);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40795475/article/details/89644781