4.3二叉树的非递归中序遍历输出王道数据结构例程实现
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef int ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
typedef struct DNode{
BiTree data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &S){
S.top=-1;
}
bool IsEmpty(SqStack &S){
if(S.top==-1)
return true;
else
return false;
}
bool Push(SqStack &S,BiTree x){
if(S.top==MaxSize-1){
return false;
}
S.data[++S.top]=x;
return true;
}
bool Pop(SqStack &S,BiTree &x){
if(-1==S.top)
return false;
x=S.data[S.top--];
return true;
}
bool GetTop(SqStack &S,BiTree &x){
if(-1==S.top)
return false;
x=S.data[S.top];
return true;
}
BiTree CreateBiTree(BiTree &T){//利用先序遍历创建二叉树
int x; //可输入1204600030500 每输入一个数字按一次回车 王道书上例程
scanf("%d",&x);
if(x!=0){ //等于0时跳过,所以该节点还为空
T=(BiTree)malloc(sizeof(BiTNode));
T->data=x;
T->lchild=NULL;
T->rchild=NULL;
T->lchild=CreateBiTree(T->lchild);
T->rchild=CreateBiTree(T->rchild);
}
return T;
}
void InOrder(BiTree T){ //中序遍历递归输出
if(T!=NULL){
InOrder(T->lchild);
int a=T->data;
printf(" %d",a);
InOrder(T->rchild);
}
}
void InOrder2(BiTree T){//利用栈,中序遍历非递归输出
SqStack S;//定义新栈
InitStack(S);BiTree p=T;//初始化栈,定义p指针,把根节点赋给p
while(p||!IsEmpty(S)){ //如果不加取反!第一次执行完,第二次执行时,p为空,栈不为空,跳出循环
if(p){
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);
int a=p->data;
printf(" %d",a);
p=p->rchild;
}
}
}
int main()
{
BiTree T;
CreateBiTree(T);
//printf("前序遍历结果\n");
// PreOrder2(T);
InOrder(T);//递归输出
printf("\n中序遍历结果\n");
InOrder2(T);//非递归输出
// printf("\n后序遍历结果\n");
// PostOrder2(T);
system("pause");
}
//前序后序的以后补上
代码运行输出