二叉树的非递归前中后序遍历和层序遍历
此次构建的树是以 前序遍历+“#” 法构建的,构建的树的前序序列为
A,B,C,#,#,D,E,#,G,#,#,F,#,#,#;
树的形状为
A
/
B
/ \
C D
/ \
E F
\
G
注:"#" 位未标出
输出样例
以下为代码及注释
#include<iostream>
#include<stdlib.h>
#include<stack> //为方便,直接使用了stack和queue的库,不再另外去写函数
#include<queue>
using namespace std;
int count = -1;//计数器
typedef struct BiTNode{
char data;
struct BiTNode *lchild ,*rchild;
}BiTNode,*BiTree;
BiTree CreatBiTree();
void PreOrderTraverse(BiTree T);
void InOrderTraverse(BiTree T);
void PostOrderTraverse(BiTree T);
void LeverOrderTraverse(BiTree T);
int main()
{
cout<<"----------------------------------------"<<endl;
cout<<"structname : 二叉树的几个遍历 "<<endl;
cout<<"author : william"<<endl;
cout<<"-------------------@copyright by william"<<endl<<endl;
char PreOrder[15] ={'A','B','C','#','#','D','E','#','G','#','#','F','#','#','#'};
cout<<"构建二叉树所用的前序遍历数据为 "<<PreOrder<<endl<<endl;
cout<<"树的形状为"<<endl;
cout<<" A "<<endl;
cout<<" B "<<endl;
cout<<" C D "<<endl;
cout<<" E F "<<endl;
cout<<" G "<<endl;
putchar('\n');
BiTree myBinaryTree;
myBinaryTree = CreatBiTree();
cout<<"创建树 OK"<<endl<<endl;
cout<<"先序遍历的结果"<<endl;
PreOrderTraverse(myBinaryTree);
putchar('\n');
cout<<"中序遍历的结果"<<endl;
InOrderTraverse(myBinaryTree);
putchar('\n');
cout<<"后序遍历的结果"<<endl;
PostOrderTraverse(myBinaryTree);
putchar('\n');
cout<<"层序遍历的结果"<<endl;
LeverOrderTraverse(myBinaryTree);
return 0;
}
BiTree CreatBiTree()
{
++count;//用于计数使每次数组里的数据后移
BiTNode *tmp = NULL;
char PreOrder[15] = {'A','B','C','#','#','D','E','#','G','#','#','F','#','#','#'};
if (PreOrder[count] == '#')
{
return NULL;
}
else
{
tmp = (BiTree)malloc(sizeof(BiTNode));//创建新的节点
if (tmp == NULL)
{
return NULL;//如果创建失败
}
tmp->data = PreOrder[count];
tmp->lchild = CreatBiTree();
tmp->rchild = CreatBiTree();//递归调用
return tmp;
}
}
void PreOrderTraverse(BiTree T)//前序遍历
{
if (T == NULL)
{
return;//空树
}
BiTree p = T;//移动的节点
stack<BiTree>s;
while (!s.empty() || p)
{
if (p)
{
cout<<p->data<<" ";//先输出根的数据
s.push(p);
p = p->lchild;
}
else
{
p = s.top();//左子树遍历完毕进入右子树 进行遍历
s.pop();
p = p->rchild;
}
}
cout << endl;
}
void InOrderTraverse(BiTree T)//中序遍历
{
if (T == NULL)
{
return;//空树
}
BiTree p = T;//移动的节点
stack<BiTree>s;
while (!s.empty() || p)
{
if (p)
{
s.push(p);
p = p->lchild;//先将左边的节点都压入栈中
}
else
{
p = s.top();
cout<<p->data<<" "; //输出了子树根的节点(左子树已经遍历完毕)转入右子树
s.pop();
p = p->rchild;
}
}
cout << endl;
}
void PostOrderTraverse(BiTree T)
{
if(T == NULL)
{
return;
}
stack<BiTree>s;
BiTree p = T;//移动的节点
BiTree temp;
while(!s.empty() || p)
{
while(p)
{
s.push(p);
p = p->lchild;
}
p = s.top();//弹出了,但没有完全没弹出
if(p->rchild == NULL || p->rchild == temp)//第二个判断当前p是否是右子树读完返回的
{
cout<<p->data<<" ";
s.pop();
temp = p;
p = NULL;//重置p
}
else
{
p = p->rchild;
}
}
cout<<endl;
}
void LeverOrderTraverse(BiTree T) //层序遍历_队列实现 ( BFS )
{
queue <BiTree> q;
BiTree p;//用于移动
if (T != NULL)
{
q.push(T); //根节点进队列
}
while (!q.empty()) //队列不为空判断
{
p = q.front();
cout << p->data<<" ";
if (p->lchild!= NULL) //如果有左孩子,leftChild入队列
{
q.push(p->lchild);
}
if (p->rchild != NULL) //如果有右孩子,rightChild入队列
{
q.push(p->rchild);
}
q.pop(); //已经遍历过的节点出队列
}
}
数据结构课程的作业–前中后序和层序的非递归实现。