在上一篇中二叉树的非递归遍历我已经完成了中序和前序遍历,模拟的是他们吧遍历的方向,如果把遍历路线逆过来,我们输出第一次遇到的结点,结果可以看到为前序遍历的逆向顺序!因此我们把输出的地方再压如另一个堆栈就可以解决了
/*
树的递归创建
*/
#include<stdio.h>
#include<stdlib.h>
typedef char Ele;
typedef struct Node
{
Ele data;
struct Node *left;
struct Node *right;
}*T,*lnode;
/*按照先序遍历创建树ABDG##H###CE#I##F##
*/
T createTree(){
T t;
Ele tmp;
scanf("%c",&tmp);
if(tmp=='#'){
t=NULL;
}else{
t=(lnode)malloc(sizeof(struct Node));
t->data=tmp;
t->left=createTree();
t->right=createTree();
}
return t;
}
/**堆栈***/
typedef lnode Elem;
const Elem ERROR=NULL;
typedef struct S{
Elem data[100];
int top;
}*Stack;
Stack createStack(){
Stack stack=(Stack)malloc(sizeof(struct S));
stack->top=-1;
return stack;
}
void push(Elem data,Stack stack){
if(stack->top>=99)
printf("堆栈满");
stack->data[++stack->top]=data;
}
Elem pop(Stack stack){
if(stack->top==-1)
return ERROR;
return stack->data[stack->top--];
}
void deleteStack(Stack s){
free(s);
}
int isempty(Stack s){
if(s->top<=-1)
return 1;
else
return 0;
}
//非递归后序遍历遍历,模拟遍历的逆行路线,第一次遇到结点压入另一个堆栈,最后输出此堆栈
void travelTree(T t){
Stack s=createStack();
Stack s1=createStack();
while(t||!isempty(s)){
while(t){
//printf("%c ",t->data);
push(t,s1);//输出的地方压入另一个栈,达到倒叙目的
push(t,s);
t=t->right;//一路向右找
}
if(!isempty(s)){
t=pop(s);
t=t->left;//转到左子树
}
}
deleteStack(s);
while(!isempty(s1)){
printf("%c ", pop(s1)->data);
}
deleteStack(s1);
}
//递归的后序遍历
void travelTree1(T t){
if(t){
travelTree1(t->left);
travelTree1(t->right);
printf("%c ",t->data);
}
}
int main(){
T t=createTree();
printf("非递归前序遍历结果");
travelTree(t);
printf("\n");
printf("递归前序遍历结果");
travelTree1(t);
printf("\n");
}