二叉树遍历非递归算法所用到的栈以及层次遍历所用到的队列的基本操作算法的实现
来源:互联网 发布:石家庄软件测试招聘 编辑:程序博客网 时间:2024/06/04 00:37
栈的基本操作算法的实现
基本数据结构
typedef struct BiNode
{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
{
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语言实现
- 实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法
- JAVA语言实现二叉树的层次遍历的非递归算法及递归算法。
- JAVA语言实现二叉树的层次遍历的非递归算法及递归算法
- 二叉树的非递归遍历以及层次遍历
- 二叉树的递归,层次,以及非递归遍历
- 二叉排序树节点的删除(C++,算法导论),前中后序遍历(递归/非递归,栈实现),按层次遍历(队列实现)
- 二叉树的层次非递归遍历运用队列
- 遍历二叉树的递归算法与非递归算法以及C语言实现
- 二叉树的递归遍历与非递归算法实现
- 二叉树的递归遍历与非递归算法实现
- 《算法导论》二叉树遍历的递归&非递归实现
- 二叉树前中后序遍历的递归版本和非递归版本、队列实现的层次遍历
- 二叉树遍历的非递归算法
- 遍历二叉树的非递归算法
- 遍历二叉树的非递归算法
- 二叉树的遍历非递归算法
- 比特币五周岁了
- DEDE调用指定文章ID
- 日期
- 比特币——富者愈富效应初浮现
- make、make clean、make install、make uninstall、make dist、make distcheck和make distclean
- 二叉树遍历非递归算法所用到的栈以及层次遍历所用到的队列的基本操作算法的实现
- 比特币持续性上涨或因美国两党谈判破裂
- VS环境中,cmake出来的ALL_BUILD项目和 ZERO_CHECK项目的作用
- Valgrind简记
- flash 应用开发 非flash builder
- android根据包名构建第三方应用的上下文Context
- 国内平台比特币(Bitcoin)搬砖流程教学
- Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException.
- 国内首起比特币交易平台诈骗案涉案人被捕