二叉树的创建、前序遍历、中序遍历、后序遍历、层序遍历总结如下(C++):
以下面这棵二叉树为例:
#include <iostream>
const int MAX = 100; //定义一个常量
using namespace std;
typedef struct BiNode //定义二叉链表的结点结构
{
char data; //定义结点的数据域
BiNode* lchild, * rchild; //定义左右孩子指针
}BiNode,*Bitree; //等同于BiNode BiNode,*Bitree;
Bitree Q[MAX]; //定义一个结构体指针数组当作队列,层序遍历用到
class BiTree
{
public:
BiTree(); //构造函数,建立一棵二叉树
~BiTree(); //析构函数,释放各结点的存储空间
void PreOrder() { PreOrder(root); } //前序遍历二叉树
void InOrder() { InOrder(root); } //中序遍历二叉树
void PostOrder(){PostOrder(root);} //后序遍历二叉树
void LeverOrder(); //层序遍历二叉树
private:
BiNode* root; //指向根结点的头指针
BiNode* Creat(BiNode* bt); //构造函数调用
void Release(BiNode* bt); //析构函数调用
void PreOrder(BiNode* bt); //前序遍历函数调用
void InOrder(BiNode* bt); //中序遍历函数调用
void PostOrder(BiNode* bt); //后序遍历函数调用
};
BiTree::BiTree()
{
root=Creat(root);
}
BiTree::~BiTree()
{
Release(root);
}
BiNode* BiTree::Creat(BiNode* bt)
{
char ch; //输入结点的数据信息,假设为字符
cin >> ch;
if (ch == '#') //根节点为空,创建一棵空树
{
bt = NULL;
}
else //采用前序遍历的方式创建二叉树
{
bt = new BiNode; //创建一个结点
bt->data = ch; //该结点的数据域为ch
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)
{
if (bt == NULL)return; //递归调用结束的条件
else
{
cout << bt->data; //访问根结点bt的数据域
PreOrder(bt->lchild); //前序递归遍历bt的左子树
PreOrder(bt->rchild); //前序递归遍历bt的右子树
}
}
void BiTree::InOrder(BiNode* bt)
{
if (bt == NULL)return; //递归调用结束的条件
else
{
InOrder(bt->lchild); //中序递归遍历bt的左子树
cout << bt->data; //访问根结点bt的数据域
InOrder(bt->rchild); //中序递归遍历bt的右子树
}
}
void BiTree::PostOrder(BiNode* bt)
{
if (bt == NULL)return; //递归调用结束的条件
else
{
PostOrder(bt->lchild); //后序递归遍历bt的左子树
PostOrder(bt->rchild); //后序递归遍历bt的右子树
cout << bt->data; //访问根结点bt的数据域
}
}
void BiTree::LeverOrder()
{
int front = -1;
int rear = -1; //采用顺序队列,并假定不会发生上溢
if (root == NULL)return; //二叉树为空,算法结束
Q[++rear] = root; //指向根结点的指针入队
Bitree q;
while (front!=rear) //当队列非空时
{
q = Q[++front]; //出队
cout << q->data;
if (q->lchild != NULL)
{
Q[++rear] = q->lchild;
}
if (q->rchild != NULL)
{
Q[++rear] = q->rchild;
}
}
}
int main()
{
BiTree mytree;
cout << "前序遍历的结果为:";
mytree.PreOrder();
cout << endl;
cout << "中序遍历的结果为:";
mytree.InOrder();
cout << endl;
cout << "后序遍历的结果为:";
mytree.PostOrder();
cout << endl;
cout << "层序遍历的结果为:";
mytree.LeverOrder();
cout << endl;
return 0;
}
运行截图如下: