用递归和非递归的方法实现一棵树的三种遍历:
#include<iostream>
#include<stdio.h>
#include<cstdio>
#define MAXSIZE 100
typedef char TElemType;
using namespace std;
typedef struct BiTNode{ //定二叉树的结构体
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//初始化二叉树
void InitBiTree(BiTree &T){
T=NULL;
}
//创建一个二叉树
void CreateBiTree(BiTree &T){
TElemType ch;
cin>>ch;
if(ch=='#') T=NULL;
else {
T = new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//递归调用
void PreOrderTraversal1(BiTree T){ //先序遍历二叉树
if(T){
cout<<T->data; //访问左子树
PreOrderTraversal1(T->lchild); //访问结点
PreOrderTraversal1(T->rchild); // 访问右子树
}
}
void InOrderTraversel1(BiTree T){ //中序遍历二叉树
if(T){
InOrderTraversel1(T->lchild); //访问左子树
cout<<T->data; //访问结点
InOrderTraversel1(T->rchild); // 访问右子树
}
}
void PostOrderTraversal1(BiTree T){ //后序遍历二叉树
if(T){
PostOrderTraversal1(T->lchild); //访问左子树
PostOrderTraversal1(T->rchild); //访问右子书
cout<<T->data;// 访问结点
}
}
//非递归调用
void PreOrderTraversal2(BiTree T){
BiTree stack[MAXSIZE];
int top; //栈顶指针
BiTNode *p; //定义一个结点的指针
top=0;
p=T;
while(p||top>0){
while(p!=NULL){
cout<<p->data;
stack[top++]=p;
p=p->lchild;
}
if(top>0){
p=stack[--top];
p=p->rchild;
}
}
}
void InOrderTraversal2(BiTree T){
BiTree stack[MAXSIZE];
int top; //栈顶指针
BiTNode *p; //定义一个结点的指针
top=0;
p=T;
while(p!=NULL||top>0){
while(p!=NULL){
stack[top++]=p;
p=p->lchild;
}
if(top>0){
p=stack[--top];
cout<<p->data;
p=p->rchild;
}
}
}
void PostOrderTraversal2(BiTree T){
BiTree stack[MAXSIZE];
int top; //栈顶指针
BiTNode *p,*q; //定义一个结点的指针
top=0;
p=T,q=NULL;
while(p!=NULL||top>0){
while(p!=NULL){
stack[top++]=p;
p=p->lchild;
}
if(top>0){
p=stack[top-1];
if(p->rchild==NULL||p->rchild==q){
cout<<p->data;
q=p;
p=NULL;
top--;
}
else p=p->rchild;
}
}
}
int main(){
int m;
char ch[MAXSIZE];
BiTree T;
InitBiTree(T);
cout<<"请输入二叉树...."<<endl;
CreateBiTree(T);
cout<<"请选择遍历方式: 输入0为递归遍历 输入1为非递归遍历"<<endl;
scanf("%d",&m);
if(m==0){
cout<<"********现在是递归调用!********"<<endl;
cout<<"先序遍历:";PreOrderTraversal1(T);cout<<"\n";
cout<<"中序遍历:";InOrderTraversel1(T);cout<<"\n";
cout<<"后序遍历:";PostOrderTraversal1(T);cout<<"\n";
}
else if(m==1){
cout<<"********现在是非递归调用!********"<<endl;
cout<<"先序遍历:";PreOrderTraversal2(T);cout<<"\n";
cout<<"中序遍历:";InOrderTraversal2(T);cout<<"\n";
cout<<"后序遍历:";PostOrderTraversal2(T);cout<<"\n";
}
else cout<<"选择有误!"<<endl;
return 0;
}