#include<iostream>
using namespace std;
template<class T>
class BTnode
{
//BTnode(){lChild=rChild=NULL;}
public:
BTnode( T x)
{
element=x;lChild=rChild=NULL;
}
/* BTnode(const T& x,BTnode<T>* l, BTnode<T>* r)
{
element=x;lChild=l;rChild=r;
}*/
T element;
BTnode<T> *lChild,*rChild;
};
template<class T>
class BinaryTree
{
public:
BinaryTree(){root=NULL;}
BinaryTree(T x);
// ~BinaryTree();
// bool isEmpty()const;
// bool root(T& x)const;
// void makeTree(const T& x);
// void makeTree(BTnode<T>* t);
void makeTree();
// void preOrder(void (*vist)(T& x));
void preOrder();
void inOrder();
void postOrder();
void out();
protected:
BTnode<T> *root;
private:
void makeTree(BTnode<T>* t);
// void makeTree(const T& x,BinaryTree<T>& left,BinaryTree<T>& right);
void preOrder(void (*visit)(T& x),BTnode<T>* t);
void inOrder(void (*visit)(T& x),BTnode<T>* t);
void postOrder(void (*visit)(T& x),BTnode<T>* t);
};
/*template<class T>
void BinaryTree<T>::BinaryTree(T x)
{
root.element=x;
}*/
template<class T>
void visit(T& x)
{
cout<<x<<" ";
}
/*template<class T>
void BinaryTree<T>::~BinaryTree()
{
}*/
template<class T>
void BinaryTree<T>::makeTree()
{
T x;
cout<<"输入根节点:"<<endl;
cin>>x;
// root= &BTnode<T>(x);
root=new BTnode<T>(x);
makeTree(root);
}
//template<class T>
/*void BinaryTree<T>::makeTree(const T& x,BinaryTree<T>& left,BinaryTree<T>& right)
{
if(root||&left==&right) return;
root=new BTnode<T>(x,left.root,right.root);
left.root=right.root=NULL;
}*/
template<class T>
void BinaryTree<T>::makeTree(BTnode<T>* t)
{
int i,j,x;
if(t)
{
cout<<t->element<<"是否有左子节点,有按1,没有按别的"<<endl;
// BTnode<T>(x);
cin>>i;
// vist(t->element);
if(i==1){
cout<<"输入左子节点:"<<endl;
cin>>x;
t->lChild=new BTnode<T>(x); }
makeTree(t->lChild);
cout<<t->element<<"是否有右子节点,有按2,没有按别的"<<endl;
cin>>j;
if(j==2){
cout<<"输入右子节点:"<<endl;
cin>>x;
t->rChild=new BTnode<T>(x); }
makeTree(t->rChild);
}
// cout<<root->element<<endl;
}
template<class T>
void BinaryTree<T>::out()
{
cout<<root->element<<endl;
}
template<class T>
void BinaryTree<T>::preOrder()
{
preOrder(visit,root);
}
template<class T>
void BinaryTree<T>::inOrder()
{
inOrder(visit,root);
}
template<class T>
void BinaryTree<T>::postOrder()
{
postOrder(visit,root);
}
template<class T>
void BinaryTree<T>::inOrder(void (*visit)(T& x),BTnode<T>* t)
{
if(t){
inOrder(visit,t->lChild);
visit(t->element);
inOrder(visit,t->rChild);
}
}
template<class T>
void BinaryTree<T>::preOrder(void (*visit)(T& x),BTnode<T>* t)
{
if(t){
visit(t->element);
preOrder(visit,t->lChild);
preOrder(visit,t->rChild);
}
}
template<class T>
void BinaryTree<T>::postOrder(void (*visit)(T& x),BTnode<T>* t)
{
if(t){
postOrder(visit,t->lChild);
postOrder(visit,t->rChild);
visit(t->element);
}
}
void main()
{
int i,j;
BinaryTree<int> A;//=new BinaryTree<int>();
cout<<"按1生成树"<<endl;
cin>>i;
if(i==1)
{
A.makeTree();
}
//A.out();
cout<<"按1先序遍历并打印,按2中序遍历并打印,按3后序遍历并打印"<<endl;
cin>>j;
if(j==1)
{A.preOrder();}else
if(j==2)
{A.inOrder();}else
if(j==3)
{A.postOrder();}
}
Attention:
1,这里的BTnode<T>是类而不是结构体;
2,这里创建二叉树采用的是类似于先序遍历的形式;
二叉树的创建与遍历
最新推荐文章于 2019-01-15 00:12:00 发布