二叉树的创建与遍历

来源:互联网 发布:apache 禁止网络爬虫 编辑:程序博客网 时间:2024/05/20 13:09

 #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,这里创建二叉树采用的是类似于先序遍历的形式;