/*
二叉树的遍历(先序中序后序,递归非递归)
输入示例:124##5##36##7##(高度为3的满二叉树)
*/
#include <iostream>
#include <cstdlib>
using namespace std;
const int MAXSIZE = 100;
typedef char ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
}*BiTree;
void CreateTree(BiTree &T){
//按照先序次序输入二叉树结点,#表示空树
char c;
cin >> c;
if(c=='#') T = NULL; //空树
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = c;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
//先序遍历
//思路1:递归
void PreOrder(BiTree T) {
if(T){
printf("%c ", T->data); //访问根结点
PreOrder(T->lchild); //递归遍历左子树
PreOrder(T->rchild); //递归遍历右子树
}
}
//思路2:非递归
void PreOrder1(BiTree T){
BiTree p, stack[MAXSIZE];
int top;
if(T){
top = 1;
stack[top] = T;
while(top>0){ //栈不空
p = stack[top--]; //退栈并访问该结点
printf("%c ", p->data);
if(p->rchild) {
stack[++top] = p->rchild; //右孩子进栈
}
if(p->lchild){
stack[++top] = p->lchild;
}
}
}
}
//中序遍历
//思路1:递归
void InOrder(BiTree T) {
if(T){
InOrder(T->lchild); //递归遍历左子树
printf("%c ", T->data); //访问根结点
InOrder(T->rchild); //递归遍历右子树
}
}
//思路2:非递归
void InOrder1(BiTree T){
BiTree p, stack[MAXSIZE];
int top = 0;
p = T;
do{
while(p){ //根结点和每一个左孩子全部入栈
stack[++top] = p;
p = p->lchild;
}
if(top>0){ //栈不空
p = stack[top--]; //栈顶出栈
printf("%c ", p->data);
p = p->rchild; //扫描p结点的右结点
}
}while(p || top>0); //栈不空 或者 p不为空--继续循环
}
//后序遍历
//思路1:递归
void PostOrder(BiTree T){
if(T){
PostOrder(T->lchild); //递归遍历左子树
PostOrder(T->rchild); //递归遍历右子树
printf("%c ", T->data); //访问根结点
}
}
//思路2:非递归
void PostOrder1(BiTree T){
BiTree p, stack[MAXSIZE];
int top = 0;
int tag[MAXSIZE]; //0表示该结点未被扫描过
p = T;
do{
while(p){ //找到最左边的结点
stack[++top] = p; //结点入栈
tag[top] = 0; //该结点的右结点没有全部扫描过
p = p->lchild;
}
if(top>0){ //栈非空
if(tag[top] == 1){ //该结点的右结点全部扫描过
printf("%c ", stack[top--]->data); //访问该结点并出栈
}
else{
p = stack[top];
p = p->rchild; //扫描右结点
tag[top] = 1; //该结点已被扫描过
}
}
}while(top>0 || p); //栈非空 或者 p结点不为空--继续循环
}
int main(){
BiTree t;
cout << "输入二叉树(先序、空树用#表示):";
CreateTree(t);
cout << "先序递归: ";
PreOrder(t);
cout << endl;
cout << "先序非递归:";
PreOrder1(t);
cout << endl;
cout << "中序递归: ";
InOrder(t);
cout << endl;
cout << "中序非递归:";
InOrder1(t);
cout << endl;
cout << "后序递归: ";
PostOrder(t);
cout << endl;
cout << "后序非递归:";
PostOrder1(t);
cout << endl;
}
程序小白,如果程序中有任何的问题,欢迎指出。