题目
实现一个链式存储的二叉树,采用非递归的形式,按照前、中、后序的顺序遍历二叉树。
代码
/**
* 二叉树的前、中、后序的非递归遍历
**/
#include <iostream>
using namespace std;
typedef char Element;
#define MAX 100
//定义二叉树
typedef struct TNode{
Element data;
struct TNode *lchild,*rchild;
}TNode,*BiTree;
//定义栈
typedef struct Stack{
TNode *data[MAX];
int top;
}Stack;
//创建二叉树,采用递归的方式
void createBiTree(BiTree &T){
Element e;
cin>>e;
if(e=='#')
T=NULL;
else{
T=(TNode *)malloc(sizeof(TNode));
T->data=e;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
//输出二叉树
void dispBiTree(BiTree T){
if(T!=NULL){
cout<<T->data<<" ";
dispBiTree(T->lchild);
dispBiTree(T->rchild);
}
}
//初始化栈
void initStack(Stack &S){
S.top=-1;
}
//判栈空
bool isEmpty(Stack S){
if(S.top==-1)
return true;
else
return false;
}
//进栈
bool push(Stack &S,TNode *e){
if(S.top==MAX-1)
return false;
else{
S.data[++S.top]=e;
return true;
}
}
//出栈
bool pop(Stack &S,TNode *&x){
if(S.top==-1)
return false;
else{
x=S.data[S.top--];
return true;
}
}
/**
* 二叉树的先序遍历的非递归
**/
void preOrder(BiTree T){
if(T==NULL)
return;
Stack S;
TNode *t;
initStack(S);
push(S,T);
while(!isEmpty(S)){
pop(S,t);
cout<<t->data<<" ";
if(t->rchild) //因为栈是先进后出,所以应该先入栈右子树,再入左子树
push(S,t->rchild);
if(t->lchild)
push(S,t->lchild);
}
}
/**
* 二叉树的中序非递归遍历
**/
void inOrder(BiTree T){
if(T==NULL)
return;
Stack S;
TNode *p=T;
initStack(S);
while(!isEmpty(S) || p!=NULL){
//将所有左子树进栈
while(p){
push(S,p);
p=p->lchild;
}
//找到最左边的结点之后,先输出该结点
pop(S,p);
cout<<p->data<<" ";
//然后找结点右子树(如果有的话)的最左边的结点
p=p->rchild;
}
}
/**
* 二叉树的后序非递归遍历
* 后序遍历可以按照前序的非递归的方式,按照根、右、左的方式前序遍历,然后再颠倒一下就可以了
**/
void postOrder(BiTree T){
if(T==NULL)
return;
Stack S,result;
initStack(S); //工作栈
initStack(result); //存放结果的栈
push(S,T);
TNode *t;
while(!isEmpty(S)){
pop(S,t);
push(result,t);
if(t->lchild)
push(S,t->lchild);
if(t->rchild)
push(S,t->rchild);
}
while(!isEmpty(result)){
pop(result,t);
cout<<t->data<<" ";
}
}
int main() {
BiTree T;
createBiTree(T);
dispBiTree(T);
cout<<endl<<"前序非递归遍历:"<<endl;
preOrder(T);
cout<<endl<<"中序非递归遍历:"<<endl;
inOrder(T);
cout<<endl<<"后序非递归遍历:"<<endl;
postOrder(T);
return 0;
}