二叉树基本操作

①前序遍历

根节点->左子树->右子树

template <class T>

void BTree<T>::PreOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)//前序遍历

{

       if(t)

       {         Visitchar(t->element);

                    PreOrder(Visit,t->lchild);

                    PreOrder(Visit,t->rchild);

       }

}

②中序遍历

左子树->根节点->右子树

template <class T>

void BTree<T>::InOrder (void (*Visit)(BTNode<T>* u),BTNode<T>* t)//中序遍历

{

       if (t)

       {

 

                    InOrder(Visit,t->lchild);

                    Visitchar(t->element);

                    InOrder(Visit,t->rchild);

       }

}

③后序遍历

左子树->右子树->根节点

template <class T>

void BTree<T>::PostOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)//后序遍历

{

       if (t)

       {

                    PostOrder(Visit,t->lchild);

                    PostOrder(Visit,t->rchild);

                    Visitchar(t->element);

       }

}

 

④计算结点个数

template <class T>

int BTree<T>::Size()

{

                    return Size(root);

}

 

template <class T>

int BTree<T>::Size(BTNode<T>*t)//递归算法,求取二叉树节点个数

{

       if (!t) return 0;

       else return Size(t->lchild)+Size(t->rchild)+1;

 

}

采用多文件方式实现:

Main.cpp:
#include"BTree.h"
#include<iostream>
using namespace std;
int main(){
    BTree<char> a,b,x,y,z;
    char e;
    y.MakeTree('E',a,b);
    z.MakeTree('F',a,b);
    x.MakeTree('C',y,z);
    y.MakeTree('D',a,b);
    z.MakeTree('B',y,x);
    cout<<"PreOrder:  ";
    z.PreOrder(Visit);
    cout<<endl;
          cout<<"InOrder:  ";
    z.InOrder(Visit);
    cout<<endl;
          cout<<"PostOrder:  ";
    z.PostOrder(Visit);
    cout<<endl;
          cout<<"LevelOrder:  ";
    z.LevelOrder(Visit);
    cout<<endl;
    z.BreakTree(e,y,x);
    cout<<"After break the tree e,y,x:  ";
    x.PreOrder(Visit);
    return 0;
}

BTree.h:
#include "head.h"
#include"queue.h"
#include "iostream"
using namespace std;
template<class T>
class BTree
{
    public:
        BTree(){root=NULL;}
        ~BTree(){}
        bool IsEmpty()const;
        bool Root(T &x)const;
        void MakeTree(const T &e ,BTree<T>& left, BTree<T>& right);
        void BreakTree(T &e ,BTree<T>& left,BTree<T>& right);

       void PreOrder(void (*Visit)(BTNode<T>* u))
        {
            PreOrder(Visit,root);
        }
        void InOrder(void (*Visit)(BTNode<T>* u))
        {
            InOrder(Visit,root);
        }
        void PostOrder(void (*Visit)(BTNode<T>* u))
        {
            PostOrder(Visit,root);
        }

        BTNode<T>* root;
        void PreOrder(void (*Visit)(BTNode<T>*u), BTNode<T>*t);
        void InOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);
        void PostOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);
        void LevelOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);
};

//判断二叉树是否为空
template<class T>
bool BTree<T>::IsEmpty() const
{
    return root==NULL;
}

//求二叉树根结点的值
template <class T>
bool BTree<T>::Root(T &x) const
{
    if (root)
    {
        x=root->element;
        return true;
    }
    else return false;
}

template <class T>
void BTree<T>::MakeTree(const T &e, BTree<T>& left, BTree<T>& right)
{
    cout<<"here in BTree<T>::MakeTree"<<endl;
    if(root||&left==&right) return;
    root=new BTNode<T>(e,left.root,right.root);
    left.root=right.root=NULL;
}

template <class T>
void BTree<T>::BreakTree(T &e,BTree<T>&left, BTree<T>& right)
{
    cout<<"here in BTree<T>::BreakTree."<<endl;
    if(!root||&left==&right||left.root||right.root)return;
    e=root->element;
    left.root=root->lchild;
    right.root=root->rchild;
    delete root; root=NULL;
}

template <class T>
void BTree<T>::PreOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)//前序遍历
{
    if(t)
    {
                    PreOrder(Visit,t->lchild);
                    Visitchar(t->element);
                    PreOrder(Visit,t->rchild);
    }
}

template <class T>
void BTree<T>::InOrder (void (*Visit)(BTNode<T>* u),BTNode<T>* t)//中序遍历
{
    if (t)
    {
                    Visitchar(t->element);
                    PreOrder(Visit,t->lchild);
                    PreOrder(Visit,t->rchild);
    }
}

template <class T>
void BTree<T>::PostOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)//后序遍历
{
    if (t)
    {
                    PreOrder(Visit,t->lchild);
                    PreOrder(Visit,t->rchild);
                    Visitchar(t->element);
    }
}
/*实现二叉树的按层遍历,用到了一个队列(第三章中的循环队列)
首先将根结点入队列,当对列不为空的时候:取队首元素,输出队首元素,
将队首元素的左右结点入队列,删除队首元素。如此循环直到队列为空。
该程序不是递归算法。
*/
template <class T>
void LevelOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t)//层次遍历
{
    Queue<BTNode<T> *> Q;

    Q.EnQueue(t);
    while(!Q.IsEmpty()){
                    Q.DeQueue(t);
                    Visit(t);
                    if(t->lchild !=NULL) Q.EnQueue(t->lchild);
                    if(t->rchild!=NULL) Q.EnQueue(t->rchild);
    }
}

Queue.h:
#include<iostream>
using namespace std;
template<class T>
class Queue
{
public:
    virtual bool IsEmpty()const=0;
    virtual bool IsFull()const=0;
    virtual bool Front(T &x)const=0;
    virtual bool EnQueue(T x)=0;
    virtual bool DeQueue()=0;
    virtual void Clear()=0;
};

Head.h:
#include<iostream>
using namespace std;
template<class T>class BTree;//Note
template<class T>
class BTNode
{
    public:
        BTNode(){lchild = rchild = 0;}
        BTNode(const T & x){ element = x; lchild = rchild = 0;}
        BTNode(const T& x,BTNode<T> *l,BTNode<T> *r)
        {
            element = x;
            lchild = l;
            rchild = r;
        }

        T element;
        BTNode<T> *lchild,*rchild;
         class BTree<T>;
        void Visit(BTNode<T> *);
        void Visitchar(char a);
};

template<class T>
void Visit(BTNode<T> * p )
{
    cout<<p->element<<" ";
}


void Visitchar(char a)
{
    cout<<a<<" ";
}

BTNode.h:
template <class T>
class BTree;

template <class T>
class BTNode
{
    public:
        BTNode(){ lchild=rchild=NULL; }
        BTNode( const T& e )
        {
            element=e;
            lchild=rchild=NULL;
        }
        BTNode(const T& e, BTNode<T> *l, BTNode<T>*r)
        {
            element=e;
            lchild=l;
            rchild=r;
        }
        T element;
        BTNode<T> *lchild, *rchild;
         class BTree<T>;
         void Visit(BTNode<T>*);
         void Visitchar(char a);
         void Print(BTNode<T>*);
};

template<class T>
void Visit(BTNode<T>* p)
{
    cout<<p->element<<"  "<,endl;
}

template<class T>
void Visitchar(char a)
{
    cout<<a<<"  "<<endl;
}

 

 
posted @ 2017-10-16 12:26  Ginger_2  阅读(148)  评论(0)    收藏  举报