前序遍历递归算法:
void PreOrder(Node *bt)//形参为结构体类型的指针
{
if(bt==NULL)return;//递归调用的结束条件
else{
cout<<bt->data;//访问根结点的data值
PreOrder(bt->lchild);//前序递归遍历bt左子树
PreOrder(bt->rchild);//前序递归遍历bt右子树
}
}
中序遍历递归算法:
void IneOrder(Node *bt)//形参为结构体类型的指针
{
if(bt==NULL)return;//递归调用的结束条件
else{
InOrder(bt->lchild);//中序递归遍历bt左子树
cout<<bt->data;//访问根结点的data值
InOrder(bt->rchild);//中序递归遍历bt右子树
}
}
后序遍历递归算法:
void PostOrder(Node *bt)//形参为结构体类型的指针
{
if(bt==NULL)return;//递归调用的结束条件
else{
PostOrder(bt->lchild);//后序递归遍历bt左子树
PostOrder(bt->rchild);//后序递归遍历bt右子树
cout<<bt->data;//访问根结点的data值
}
}
前序非递归算法伪代码:(中序与前序类似)
1.栈s初始化;
2.循环直到bt为空且栈s为空
2.1 当bt不为空时循环
2.1.1 输出bt->data;
2.1.2 将指针bt保存至栈中;
2.1.3 继续遍历bt的左子树;
2.2 如果s不空时,则
2.2.1 将栈顶元素弹出至bt;
2.2.2 准备遍历bt的右子树;
构造一个二叉树,输出前中后序遍历的三种序列c++实现如下:
#include <iostream>
using namespace std;
struct BiNode
{
char data;
BiNode *rchild, *lchild;
};
class BiTree
{
public :
BiTree() { root=Creat(root); }//构造函数,建立一个二叉树
~BiTree() { Release(root); }//析构函数,释放各结点的存储空间
void Pre() { PreOrder(root); }//前序遍历
void In() { InOrder(root); }//中序遍历
void Psot() { PostOrder(root); }//后序遍历
private:
char ch;
BiNode *root;//指向根结点的头指针
BiNode * Creat(BiNode *bt);
void Release(BiNode *bt);
void PreOrder(BiNode *bt);
void InOrder(BiNode *bt);
void PostOrder(BiNode *bt);//共有成员函数的调用
};
BiNode * BiTree::Creat(BiNode *bt)
{
cin >> ch;//输入结点数据信息
if (ch == '#') bt=NULL;//建立一个空树,当输入“#”时表示到达叶结点
else {
bt = new BiNode; bt->data = ch;//生成结点,将输入的值赋给data
bt->lchild =Creat(bt->lchild);
bt->rchild =Creat(bt->rchild);//递归建立左右子树
}
return bt;
}
void BiTree::Release(BiNode *bt)
{
if (bt != NULL) {
Release(bt->lchild);
Release(bt->rchild);//递归释放左右子树,从叶结点开始释放
delete bt;//释放根结点
}
}
void BiTree::PreOrder(BiNode *bt)
{
BiNode *s[10];
int top = -1;//采用顺序栈,假定不发生上溢
while (bt != NULL || top != -1)//跳出循环的条件,没有叶结点以及栈为空
{
while (bt!=NULL)//直到的叶结点
{
cout << bt->data;//输出data值,前序和中序仅这一语句的位置不相同
s[++top] = bt;//根指针入栈
bt=bt->lchild;
}
if (top!=-1)//栈不为空时
{
bt = s[top--];//出栈操作
bt = bt->rchild;
}
}
}
void BiTree::InOrder(BiNode *bt)//中序遍历与前序类似,略微有差别
{
BiNode *s[10];
int top = -1;
while (bt != NULL || top!= -1)
{
while (bt != NULL)
{
s[++top] = bt;
bt = bt->lchild;
}
if (top != -1)
{
bt =s[top--];
cout << bt->data;
bt = bt->rchild;
}
}
}
void BiTree::PostOrder(BiNode *bt)
{
if(bt == NULL) return;
else
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout << bt->data;
}
}
int main()
{
BiTree Test;
cout << "The PreOrder is:" << endl;
Test.Pre();
cout <<endl<< "The InOrder is:" << endl;
Test.In();
cout <<endl<< "The PostOrder is"<<endl;
Test.Psot();
return 0;
}