二叉树的三种非递归遍历

来源:互联网 发布:windows errorcode 2 编辑:程序博客网 时间:2024/06/08 18:06

      二叉树有三种遍历方法,分别是前序遍历,中序遍历和后序遍历,下面分享下前两种方法的非递归形式。

      由于二叉树的这三种遍历过程非常适合堆栈的结构特点,即"先进后出",所以采用堆栈的结构。在沿左子树深入时,进入一个结点就将其压入堆栈。若是先序遍历,则在入栈之前访问之;当沿左分支深入不下去时,则返回,即从堆栈里弹出前面压入的结点;若为中序遍历,则此时访问该结点,然后从该结点的右子树继续深入;

      树与堆栈结构如下:(我采用的是顺序栈)

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


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

   前序遍历:

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

   

   中序遍历:

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

   现在给定一颗二叉树,采用给出前序遍历和中序遍历的方法建立二叉树,然后按前序和中序的方法遍历二叉树,代码如下:

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


  


0 0
原创粉丝点击