您的位置:首页 > 其它

二叉树的三种非递归遍历

2016-08-09 11:12 218 查看
      二叉树有三种遍历方法,分别是前序遍历,中序遍历和后序遍历,下面分享下前两种方法的非递归形式。

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

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

     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;

}

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: