日常说明:首先博主也是菜鸟一枚,有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试
通过。重要提醒!!!!博主使用的是VS2017,如果有低版本的小伙伴
最好新建空项目将此代码复制上去。
更多算法请关注我的算法专栏https://blog.csdn.net/column/details/20417.html
运行截图:
BinaryNode.h
/**********************************
* algorithms.h :结点类*
* author : shilei *
* created : 2018.4.9 *
***********************************/
#include <cstdlib>
#include <iostream>
using namespace std;
template<class T>
class BiNode
{
public:
T data;
BiNode<T> *lchild, *rchild;
BiNode(T data,BiNode<T>*lchild = NULL,BiNode<T>*rchild = NULL)
{
this->data = data;
this->lchild = lchild;
this->rchild = rchild;
}
};
BiTree.h
/**********************************
* algorithms.h :二叉树建造和三种遍历*
* author : shilei *
* created : 2018.4.9 *
***********************************/
#include "BinaryNode.h"
using namespace std;
#define ElemType int
template <class T>
class BiTree
{
public:
BiNode<T> *root;//指向根结点
BiTree();//构造空树
~BiTree();
BiTree(T prelist[],int n);
bool empty();
void InOrder();
void PostOrder();
friend ostream& operator<<<>(ostream&, BiTree<T>&);//先序遍历输出
private:
BiNode<T>*CreatTree(T prelist[], int n, int&i);//先序遍历构造二叉树
void PreOrder(BiNode<T>*p);
void InOrder(BiNode<T>*p);
void PostOrder(BiNode<T>*p);//遍历以P结点为根的子树
};
template<class T>
BiTree<T>::BiTree()
{
this->root = NULL;
}
template<class T>
BiTree<T>::~BiTree()
{
}
template<class T>
bool BiTree<T>::empty()
{
return this->root == NULL;
}
template<class T>
BiTree<T>::BiTree(T prelist[],int n)
{
int i = 0;
this->root = this->CreatTree(prelist, n, i);
}
template<class T>
BiNode<T>*BiTree<T>::CreatTree(T prelist[], int n, int&i)
{
BiNode<T>*p = NULL;
if (i<n)
{
T data = prelist[i];
i++;
if (data =='#')
{
p = new BiNode<T>(data);
p->lchild = NULL;
p->rchild = NULL;
}
else
{
p = new BiNode<T>(data);//创建新的结点
p->lchild = CreatTree(prelist, n, i);
p->rchild = CreatTree(prelist, n, i);//递归调用
}
}
return p;
}
template<class T>
ostream& operator<<<>(ostream&out,BiTree<T>&Btree)//重载输出符,输出树的元素
{
out << "先序遍历二叉树: ";
Btree.PreOrder(Btree.root);//调用先序遍历的递归函数,提供从根节点遍历的函数
out << endl;
return out;
}
template<class T>
void BiTree<T>::PreOrder(BiNode<T>*p)//先序遍历递归调用
{
if (p != NULL)
{
if (p->data != '#')
{
cout << p->data << " ";
PreOrder(p->lchild);
PreOrder(p->rchild);
}
else
{
PreOrder(p->lchild);
PreOrder(p->rchild);
}
}
}
template<class T>
void BiTree<T>::InOrder()//中序遍历输出
{
cout << "中序遍历二叉树: ";
this->InOrder(root);//提供从根节点遍历的函数,调用中序遍历的递归函数
cout << endl;
}
template<class T>
void BiTree<T>::InOrder(BiNode<T>*p)
{
/*if ( p != NULL)
{
InOrder(p->lchild);
InOrder(p->rchild);
cout << p->data << " ";
}*/
if (p!=NULL)
{
if (p->data != '#')
{
InOrder(p->lchild);
cout << p->data << " ";
InOrder(p->rchild);
}
else
{
InOrder(p->lchild);
InOrder(p->rchild);
}
}
}
template<class T>
void BiTree<T>::PostOrder()//中序遍历输出
{
cout << "后序遍历二叉树: ";
this->PostOrder(root);//提供从根节点遍历的函数,调用后序遍历的递归函数
cout << endl;
}
template<class T>
void BiTree<T>::PostOrder(BiNode<T>*p)
{
/*if ( p != NULL)
{
PostOrder(p->lchild);
PostOrder(p->rchild);
cout << p->data << " ";
}*/
if (p!=NULL)
{
if (p->data != '#')
{
PostOrder(p->lchild);
PostOrder(p->rchild);
cout << p->data << " ";
}
else
{
PostOrder(p->lchild);
PostOrder(p->rchild);
}
}
}
BiTree.cpp
/**********************************
* algorithms.h :main*
* author : shilei *
* created : 2018.4.9 *
***********************************/
#include "BiTree.h"
using namespace std;
int main()
{
cout << "请输入数组元素的个数:";
int n;
cin >> n;
char *prelist = new char[n];
/*int n = 21;
char prelist[] = { 'A','B','#','C','I','#','#','#','D','E','H','#','#','#','F','J','#','#','G','#','#' };*/
for (int i = 0; i < n; i++)
{
cin >> prelist[i];
}
BiTree<char>Bitree(prelist,n);
cout << endl;
cout << Bitree;
cout << endl;
Bitree.InOrder();
cout << endl;
Bitree.PostOrder();
return 0;
}