实验要求:
以二叉链表为存储结构,实现二叉树的先、中、后三种次序的递归和非递归遍历。
(1)创建二叉树
(2)递归方式遍历:先、中、后三种次序
(3)非递归方式遍历:先、中、后和层序四种次序
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef char ElemType;
//构造二叉树
typedef struct BiNode{
ElemType data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
//构造栈
typedef struct {
BiTree elem[MAXSIZE];
int top;
int stacksize;
}SqStack;
//构造队列
typedef struct LNode{
BiTree data;
struct LNode *next;
}LNode,*LinkList;
typedef struct{
LinkList front;
LinkList rear;
}LinkQueue;
//初始化栈
int InitStack(SqStack &S){
S.top = 0;
S.stacksize = MAXSIZE;
return OK;
}
//初始化队列
int initQueue(LinkQueue &Q){
LinkList S = new LNode;
if(!S) return ERROR;
Q.front = Q.rear = S;
Q.front -> next = NULL;
return OK;
}
//进栈
int Push(SqStack &S,BiTree e){
if(S.top >= S.stacksize) return ERROR;
S.elem[S.top++] = e;
return OK;
}
//出栈
int Pop(SqStack &S,BiTree &e){
if(S.top == 0) return ERROR;
e = S.elem[S.top-1];
S.top--;
return OK;
}
//入队
int inQueue(LinkQueue &Q,BiTree e){
LinkList S = new LNode;
if(!S) return ERROR;
S->data = e;
S->next = NULL;
Q.rear->next = S;
Q.rear = S;
return OK;
}
//出队
int deQueue(LinkQueue &Q,BiTree &e){
if(Q.front == Q.rear) return ERROR;
LinkList p = Q.front ->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear ==p) Q.rear = Q.front;
delete p;
return OK;
}
//创建二叉树
int createBiTree(BiTree &bt,string preorder,int &index){
//调用前index必须赋值为0
char ch = preorder[index++];
if(ch == '#') bt = NULL;
else{
if(!(bt = new BiNode)) exit(-1);
bt->data = ch;
createBiTree(bt->lchild,preorder,index);
createBiTree(bt->rchild,preorder,index);
}
return OK;
}
//递归先序遍历二叉树
void PreOrder(BiTree bt){
if(!bt) return;
cout << bt->data;//访问根(先序)
PreOrder(bt->lchild);//遍历左子树
PreOrder(bt->rchild);//遍历右子树
}
//递归中序遍历二叉树
void InOrder(BiTree bt){
if(!bt) return;
InOrder(bt->lchild);//遍历左子树
cout << bt->data;//访问根(中序)
InOrder(bt->rchild);//遍历右子树
}
//递归后序遍历二叉树
void PostOrder(BiTree bt){
if(!bt) return;
PostOrder(bt->lchild);//遍历左子树
PostOrder(bt->rchild);//遍历右子树
cout << bt->data;//访问根(后序)
}
//非递归先序遍历
int preOrder(BiTree bt){
SqStack S;
InitStack(S);
BiTree p = bt;
while(S.top || p){
if(p){
cout<<p->data;
Push(S,p);
p = p->lchild;
}else{
Pop(S,p);
p = p->rchild;
}
}return OK;
}
//非递归中序遍历
int inOrder(BiTree bt){
SqStack S;
InitStack(S);
BiTree p = bt;
while(S.top || p){
if(p){
Push(S,p);
p = p->lchild;
}else{
Pop(S,p);
cout<<p->data;
p = p->rchild;
}
}return OK;
}
//非递归后序遍历
int postOrder(BiTree bt){
SqStack S;
InitStack(S);
BiTree p = bt;
BiTree last = bt;
while(S.top || p){
while(p){
Push(S,p);
p = p->lchild;
}
p = S.elem[S.top-1];
if(!p->rchild||p->rchild == last){
cout<<p->data;
Pop(S,last);
p = NULL;
}else p = p->rchild;
}
return OK;
}
//非递归层序遍历
int levelOrder(BiTree bt){
if(!bt) return ERROR;
LinkQueue Q;
initQueue(Q);
BiTree p = bt;
inQueue(Q,p);//入队
while(Q.front != Q.rear){
deQueue(Q,p);
cout<<p->data;
if(p->lchild) inQueue(Q,p->lchild);
if(p->rchild) inQueue(Q,p->rchild);
}
}
//主函数
int main(){
BiTree bt;
int index = 0;
string preorder;
// string preorder = "-+a##*b##-c##d##/e##f##"; //输入的树
cout<<"请输入一棵二叉树:"<<endl;
cin>>preorder;
cout<<endl;
createBiTree(bt,preorder,index);
//递归实现
cout<<"递归实现先序遍历: ";
PreOrder(bt);
cout<<endl;
cout<<"递归实现中序遍历: ";
InOrder(bt);
cout<<endl;
cout<<"递归实现后序遍历: ";
PostOrder(bt);
cout<<endl<<endl;
//非递归实现
cout<<"非递归实现先序遍历:";
preOrder(bt);
cout<<endl;
cout<<"非递归实现中序遍历:";
inOrder(bt);
cout<<endl;
cout<<"非递归实现后序遍历:";
postOrder(bt);
cout<<endl;
cout<<"非递归实现层序遍历:";
levelOrder(bt);
return OK;
}