//非递归的主要思想就是利用栈将三种遍历的递归函数手动实现
#include <stdio.h>
#include <stdlib.h>
#define M 255
//二叉树
typedef struct node{
char data;
struct node *lchild,*rchild;
}TreeNode,*BiTree;
BiTree T;
//栈
typedef struct Node{
BiTree data[M];
int top;
}SqStack;
SqStack S;
//使用到的栈操作
/***********************************************/
void InitStack(SqStack &S){
S.top=-1;
}
bool Push(SqStack &S,BiTree e){ //入栈
if(S.top==M-1){ //栈满报错
return false;
}
S.data[++S.top]=e;
return true;
}
bool Pop(SqStack &S,BiTree &x){ //出栈
if(S.top==-1){ //栈空报错
return false;
}
x=S.data[S.top--];
return true;
}
bool StackEmpty(SqStack &S){ //判断栈空
if(S.top==-1){
return true;
}
else{
return false;
}
}
/*****************************************************/
void visit(BiTree t){ //输出当前节点
printf("%c ",t->data);
}
void CreatTree(BiTree &T){ //利用先序遍历的递归建树
char c;
scanf("%c",&c);
if(c!='#'){
T=(TreeNode *)malloc(sizeof(TreeNode));
T->data=c;
T->lchild=T->rchild=NULL;
CreatTree(T->lchild);
CreatTree(T->rchild);
}
}
void In_PreOrder(BiTree t){ //非递归实现先序遍历
while(!StackEmpty(S) || t){
while(t){
Push(S,t);
visit(t);
t=t->lchild;
}
if(!StackEmpty(S)){
Pop(S,t);
t=t->rchild;
}
}
}
void In_InOrder(BiTree t){ //非递归实现中序遍历
while(!StackEmpty(S) || t){
while(t){
Push(S,t);
t=t->lchild;
}
if(!StackEmpty(S)){
Pop(S,t);
visit(t);
t=t->rchild;
}
}
}
//后续遍历是左右根的顺序,我们只要以根右左的顺序入栈再出栈就可以得到后序遍历的结果
void In_PostOrder(BiTree t){ //非递归后序遍历
SqStack si; //辅助栈
InitStack(si);
while(!StackEmpty(si) || t){
while(t){
Push(S,t);
Push(si,t);
t=t->rchild;
}
if(!StackEmpty(si)){
Pop(si,t);
t=t->lchild;
}
}
while(!StackEmpty(S)){
Pop(S,t);
visit(t);
}
}
int main(){
InitStack(S);
CreatTree(T);
printf("\n非递归先序遍历:");
In_PreOrder(T);
printf("\n非递归中序遍历:");
In_InOrder(T);
printf("\n非递归后序遍历:");
In_PostOrder(T);
return 0;
}
二叉树的先/中/后序遍历的非递归实现
最新推荐文章于 2024-10-05 15:32:05 发布