二叉树遍历(C++)
作者:互联网
二叉树遍历(C++)
/*********************************
对应教材5.5节,二叉树定义
**********************************/
#include <iostream>
#include <cstring>
using namespace std;
template <typename DataType>
struct BiNode{
DataType data;
BiNode<DataType> *lchild,*rchild;
};
template <typename DataType>
class BiTree{
public:
BiTree( ){root = Creat(root);} //构造函数一棵建立一棵二叉树
~BiTree( ){Release(root);} //析构函数一棵空的二叉树
void PreOrder( ){PreOrder(root);}//前序遍历二叉树
void InOrder( ){InOrder(root);} //中序遍历二叉树
void PostOrder( ){PostOrder(root);}//后序遍历二叉树
void LeverOrder( ); //层序遍历二叉树
private:
BiNode<DataType> *Creat(BiNode<DataType> *bt); //构造函数调用
void Release(BiNode<DataType> *bt); //析构函数调用
void PreOrder(BiNode<DataType> *bt); //前序遍历函数调用
void InOrder(BiNode<DataType> *bt); //中序遍历函数调用
void PostOrder(BiNode<DataType> *bt); //后序遍历函数调用
BiNode<DataType> *root; //根节点
};
//构造函数
template <typename DataType>
BiNode<DataType> *BiTree<DataType> :: Creat(BiNode<DataType> *bt){
char ch;
cin >> ch; //输入结点的数据信息,假设为字符
if (ch == '#') bt = NULL; //建立一棵空树
else {
bt = new BiNode<DataType>;
bt->data = ch;
bt->lchild = Creat(bt->lchild); //递归建立左子树
bt->rchild = Creat(bt->rchild); //递归建立右子树
}
return bt;
}
//析构函数
template <typename DataType>
void BiTree<DataType> :: Release(BiNode<DataType> *bt)
{
if (bt == NULL) return;
else{
Release(bt->lchild); //释放左子树
Release(bt->rchild); //释放右子树
delete bt; //释放根结点
}
}
//前序遍历函数 根左右
template <typename DataType>
void BiTree<DataType> :: PreOrder(BiNode<DataType> *bt)
{
if (bt == NULL) return; //递归调用的结束条件
else {
cout << bt->data; //访问根结点bt的数据域
PreOrder(bt->lchild); //前序递归遍历bt的左子树
PreOrder(bt->rchild); //前序递归遍历bt的右子树
}
}
//中序遍历函数 左根右
template <typename DataType>
void BiTree<DataType> :: InOrder(BiNode<DataType> *bt)
{
if (bt == NULL) return; //递归调用的结束条件
else {
InOrder(bt->lchild); //前序递归遍历bt的左子树
cout << bt->data; //访问根结点bt的数据域
InOrder(bt->rchild); //前序递归遍历bt的右子树
}
}
//后序遍历函数 左右根
template <typename DataType>
void BiTree<DataType> :: PostOrder(BiNode<DataType> *bt)
{
if (bt == NULL) return; //递归调用的结束条件
else {
PostOrder(bt->lchild); //前序递归遍历bt的左子树
PostOrder(bt->rchild); //前序递归遍历bt的右子树
cout << bt->data; //访问根结点bt的数据域
}
}
//层序遍历函数
template <typename DataType>
void BiTree<DataType> :: LeverOrder( )
{
BiNode<DataType> *Q[100], *q = NULL;
int front = -1, rear = -1;
if (root == NULL) return;
Q[++rear] = root;
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()
{
cout<<"请输入二叉树,#表示空:";
BiTree<char> T;
cout<<endl;
cout<<"该二叉树的前序遍历序列是:";
T.PreOrder();
cout<<endl;
cout<<"该二叉树的中序遍历序列是:";
T.InOrder();
cout<<endl;
cout<<"该二叉树的后序遍历序列是:";
T.PostOrder();
cout<<endl;
cout<<"该二叉树的层序遍历序列是:";
T.LeverOrder();
cout<<endl;
return 0;
}
二叉树的结构:
标签:BiNode,遍历,void,C++,bt,二叉树,前序 来源: https://blog.csdn.net/Milky_Yankee/article/details/116503613