二叉树遍历非递归算法所用到的栈以及层次遍历所用到的队列的基本操作算法的实现

原创 2013年12月05日 11:43:32
栈的基本操作算法的实现
基本数据结构
typedef struct BiNode
{
 char data;
 struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
 
//栈的数据结构
//栈元素类型
typedef struct
{
     BiNode *stack[maxn];    // 存储节点数组
      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==maxn-1)        //栈满则返回
            return 1;
      else
            return 0;
}
void Push(Stack &S,BiNode *e)   //进栈操作,因为栈要发生变化,所以栈要用引用型
{
      if (!(StackFull(S)))     //进栈之前要判断栈是否满,若满,则不能进栈
     {
           S->top++;             // 先移动栈顶指针,再压入元素
           S->stack[S->top]=e;
     }
      else
            return ;
}
BiNode* Pop(Stack &S)  // 出栈操作,即弹出栈顶元素,用一个节点保存弹出的栈顶元素,作为返回值
{
     BiNode *e;
      if (!(StackEmpty(S)))  // 出栈之前,要判断栈是否为空,若为空,则无效操作
     {
           e=S->stack[S->top];    // 先挪出元素,再移动栈顶指针
           S->top--;
            return e;
     }
      else
            return NULL;
}
 
BiNode* GetsTop(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;
}

我会在下一篇文章里,给出二叉树的四种遍历算法以及相应的非递归算法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C语言实现二叉树的递归和非递归算法的基本操作

#include #include#define STACKINITSIZE 100 #define STACKINCREASESIZE 20typedef char ElemType; //树结构 ...

二叉树遍历非递归算法

输入代码: #include #include #define MaxSize 100 typedef char ElemType; using namespace std; typedef s...

二叉树遍历非递归算法

http://www.360doc.com/content/07/0601/21/9889_533413.shtml 先序非递归算法 【思路】 假设:T是要遍历树的根指针,若T !=...

JAVA实现二叉树的遍历的非递归算法及递归算法(前序,中序,后序,层次)

/*遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)