1. 程式人生 > >二叉樹的三種非遞迴遍歷

二叉樹的三種非遞迴遍歷

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


#define MAXN 50


typedef struct TreeNode *BinTree;
struct TreeNode{
   char Data;
   BinTree Left;
   BinTree Right;
};


typedef struct StackNode *Stack;
struct StackNode{
   BinTree Data[MAXN];
   int Top;
};


BinTree CreateTree(char Pre[], char In[], int Len)
{
    BinTree T;
    int i;


    if(!Len)
       return NULL;


    T = malloc(sizeof(struct TreeNode));
    T->Data = Pre[0];
    for(i = 0; i < Len; i++)
        if(In[i] == Pre[0])
           break;
    T->Left = CreateTree(Pre+1, In, i);
    T->Right = CreateTree(Pre+i+1, In+i+1, Len-i-1);


    return T;
}






void Push(BinTree item, Stack p)
{
    if(p->Top == MAXN-1)
    {
        printf("The stack is full\n");
        return ;
    }
    else{
       p->Data[++(p->Top)] = item;
       return;
    }
}


BinTree Pop(Stack p)
{
    if(p->Top == -1)
    {
        printf("The stack is empty\n");
        return NULL;
    }
    else
       return (p->Data[(p->Top)--]);
}


int IsEmpty(Stack S)
{
    if(S->Top == -1)
        return 1;
    else
        return 0;
}


void InOrderTravel(BinTree BT)
{
   BinTree T;
   Stack S = malloc(sizeof(struct StackNode));
   S->Top = -1;


   T = BT;


   while(T || !IsEmpty(S)){
      while(T){
      Push(T,S);
      T = T->Left;
   }
   T = Pop(S);
   printf("%c ", T->Data);
   T = T->Right;
}
}


void PreOrderTravel(BinTree BT)
{
   BinTree T;
   Stack S = malloc(sizeof(struct StackNode));
   S->Top = -1;


   T = BT;


   while(T || !IsEmpty(S)){
      while(T){
         printf("%c ", T->Data);
         Push(T,S);
         T = T->Left;
      }
   T = Pop(S);
   T = T->Right;


}
}






int main()
{
    BinTree BT;
    char Pre[MAXN], In[MAXN];
    int n;


    scanf("%d", &n);
    scanf("%s%s", Pre, In);
    BT = CreateTree(Pre, In, n);
    InOrderTravel(BT);
    printf("\n");
    PreOrderTravel(BT);


    return 0;
}