zoukankan      html  css  js  c++  java
  • 二叉树遍历非递归算法所用到的栈以及层次遍历所用到的队列的基本操作算法的实现

    #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!
    ");
        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! " );
          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;
    }
  • 相关阅读:
    [转]在Windows 7 X64系统中安装SharePoint 2010
    使用CUBE和ROLLUP对数据进行汇总
    SQL Server、Oracle数据库排序空值null问题解决办法
    解释传统与敏捷方法最贴切的故事:大象与猴子
    3个简单的问题教会你如何做人、做事、做学问
    DOS命令行方式使用FTP实战练习
    SQL四种语言:DDL,DML,DCL,TCL
    如何对软件需求进行测试
    Windows中的句柄(handle)
    软件静默安装参数
  • 原文地址:https://www.cnblogs.com/luckyraye/p/6745044.html
Copyright © 2011-2022 走看看