二叉樹遍歷非遞歸算法所用到的棧以及層次遍歷所用到的隊列的基本操作算法的實現


#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
#define MAXSIZE 100
typedef struct node
{
    char data;
    struct node*lc;
    struct node*rc;
}Node, *BiTree;//二叉鏈表的數據元素


typedef struct
{
    Node*node;
    int layer;
}BTNRecord;//隊列的數據元素


typedef struct
{
    Node *stack[MAXSIZE];     
    int top;                 
}BStack, *Stack;//棧的數據元素



//基本操作
// 棧初始化
Stack InitStack()
{
    Stack S;
    S = (BStack*)malloc(sizeof(BStack));
    if (S)
        S->top = -1;
    else
        printf("Init stack error!\n");
    return S;
}
int StackEmpty(Stack S)        //判斷棧是否為空
{
    if (S->top == -1)            //若為空,則返回
        return 1;

    else

        return 0;

}

int StackFull(Stack S)        //判斷棧是否滿
{
    if (S->top == MAXSIZE - 1)        //棧滿則返回
        return 1;
    else
        return 0;
}
void Push(Stack &S, Node *e)   //進棧操作,因為棧要發生變化,所以棧要用引用型
{
    if (!(StackFull(S)))     //進棧之前要判斷棧是否滿,若滿,則不能進棧
    {
        S->top++;             // 先移動棧頂指針,再壓入元素
        S->stack[S->top] = e;
    }
    else
        return;
}

void Pop(Stack &S)    //出棧
{ 
    if (S->top==-1)    //出棧之前要判斷棧是否空,若空,返回空指針
    {
        return;
    }
        //移動棧頂指針
    S->top--;    
}

Node* GetTop(Stack S)
{
    if (StackEmpty(S))
        return NULL;
    else
        return S->stack[S->top];
}

void Free(Stack &S)
{
    free(S);
}

 

棧的基本操作算法的實現
 
以上棧的實現可以用於二叉樹的先序遍歷和中序遍歷非遞歸算法的實現。
因為二叉樹的后序非遞歸遍歷算法的實現較前面兩種相對復雜,故給出了另外一種新的棧的實現。
其實只是存儲元素稍微有些不同。其他的基本操作實現差不多一樣。
基本代碼如下:
后序非遞歸遍歷實現所需要的棧的結構
// 棧的數據結構
// 棧元素類型
typedef struct
{
     BiNode *q;             // 存放結點地址
      int tag;               // 存放當前狀態位
}SNode;
typedef struct
{
     SNode stack[maxn];    // 存儲節點數組
      int top;                // 棧頂指針
}BStacks,*Stacks;
 
// 棧初始化
Stacks InitStacks()
{
     Stacks S;
     S=(BStacks*)malloc( sizeof (BStacks));
      if (S)
           S->top=-1;
      else
           printf( "Init stack error!\n" );
      return S;
}
int StacksEmpty(Stacks S)        //判斷棧是否為空
{
      if (S->top==-1)            //若為空,則返回
            return 1;
      else
      return 0;
}
int StacksFull(Stacks S)        //判斷棧是否滿
{
      if (S->top==maxn-1)        //棧滿則返回
            return 1;
      else
            return 0;
}
void Pushs(Stacks &S,SNode *e)   //進棧操作,因為棧要發生變化,所以棧要用引用型
{
      if (!(StacksFull(S)))     //進棧之前要判斷棧是否滿,若滿,則不能進棧
     {
           S->top++;             // 先移動棧頂指針,再壓入元素
           S->stack[S->top]=*e;
     }
      else
            return ;
}
SNode* Pops(Stacks &S)  // 出棧操作,即彈出棧頂元素,用一個節點保存彈出的棧頂元素,作為返回值
{
     SNode *e;
      if (!(StacksEmpty(S)))  // 出棧之前,要判斷棧是否為空,若為空,則無效操作
     {
           e=&(S->stack[S->top]);    // 先挪出元素,再移動棧頂指針
           S->top--;
            return e;
     }
      else
            return NULL;
}
 
SNode* GetsTop(Stacks S)
{
      if (StacksEmpty(S))
            return NULL;
      else
      return &(S->stack[S->top]);
}
 
void Free(Stacks &S)
{
     free(S);
}
 
 
下面給出二叉樹層次遍歷所需要的數據結構:隊列。
二叉樹層次遍歷用到的數據結構:隊列。
 
typedef struct Node
{
     BiNode *data;
      struct Node *next;
}LQueNode;
typedef struct
{
     LQueNode *front,*rear;
}LinkQueue;
 
void InitQueue(LinkQueue *&Q)
{
     Q=(LinkQueue *)malloc( sizeof (LinkQueue));
     Q->front=Q->rear=NULL;
}
 
int QueueEmpty(LinkQueue *Q)
{
      if (Q->front==NULL||Q->rear==NULL)
            return 1;
      else
            return 0;
}
 
void EnQueue(LinkQueue *&Q,BiNode *e)
{
     LQueNode *p;
     p=(LQueNode *)malloc( sizeof (LQueNode));
     p->data=e;
     p->next=NULL;
      if (Q->rear==NULL)
           Q->front=Q->rear=p;
      else
     {
           Q->rear->next=p;
           Q->rear=p;
     }
}
 
BiNode* DeQueue(LinkQueue *&Q)
{
     BiNode *e;
     LQueNode *p;
      if (Q->rear==NULL)     //隊空不能出列
            return NULL;
      else
           p=Q->front;
      if (Q->front==Q->rear)       //隊列中只有一個元素時的出隊操作需特殊處理
           Q->front=Q->rear=NULL;
      else
           Q->front=Q->front->next;
     e=p->data;
     free(p);
      return e;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM