二叉树的类模板

类封装得还是不错的,个人觉得,都是老师逼出来的。。。

#include <iostream>
#include <stdlib.h>
#include <queue>
typedef char E;
using namespace std;
template <typename E>
class BinNode{
public:
    virtual ~BinNode(){
    };
    virtual E& element()=0;
    virtual void setElement(const E&)=0;
    virtual BinNode* left() const=0;
    virtual void setLeft(BinNode*)=0;
    virtual BinNode* right() const=0;
    virtual void setRight(BinNode*)=0;
    virtual bool isLeaf()=0;
};
template <typename E>
class BSTNode : public BinNode<E>{
private:
	E data;
	BSTNode* lchild;
	BSTNode* rchild;
public:
    BSTNode(){lchild=rchild=NULL;}
    BSTNode(E e,BSTNode* lc=NULL,BSTNode* rc=NULL){
        data=e;
        lchild=lc;
        rchild=rc;
    }
    ~BSTNode(){}
    E& element() {return data;}
    void setElement(const E& e){
        data=e;
    }
    inline BSTNode* left() const{
        return lchild;
    }
    void setLeft(BinNode<E> *b){
        lchild=(BSTNode*)b;
    }
    inline BSTNode* right() const{
        return rchild;
    }
    void setRight(BinNode<E> *b){
        rchild=(BSTNode*)b;
    }
    bool isLeaf(){
        return (lchild==NULL)&&(rchild==NULL);
    }
};

template <typename E>
class BSTree : public BSTNode<E>{
private:
    BSTNode<E>* root;
public:
    BSTree(){};
    ~BSTree(){};
    BSTNode<E>* setRoot(BSTNode<E>* R)
    {
        root=R;
    }
    BSTNode<E>* getRoot()
    {
    return root;
    }
int depthOfBiTree(BSTNode<E>* R){
    int ldepth;
    int rdepth;
    if(R==NULL)
        return 0;
    ldepth=depthOfBiTree(R->left());
    rdepth=depthOfBiTree(R->right());
    return (ldepth>rdepth)?(ldepth+1):(rdepth+1);//取左右子树的大值
}
int count_treenode(BSTNode<E>* R){
     if(R){
        return(count_treenode(R->left())+count_treenode(R->right())+1);
     }
     return 0;
}
void LevelOrder(BSTNode<E>* R){
    BSTNode<E>*temp;
    queue<BSTNode<E>*> Q;
    if(R==NULL) return;
    Q.push(R);
    while(!Q.empty()){
        temp=Q.front();
        Q.pop();
        cout<<temp->element()<<' ';
        if(temp->left()!=NULL){
            Q.push(temp->left());
        }
        if(temp->right()!=NULL){
            Q.push(temp->right());
        }
    }

}
void PreOrderTraverse(BSTNode<E>* R){
    if(R==NULL)//基例,找到空子树
        return;
    cout<<R->element()<<' ';
    PreOrderTraverse(R->left());
    PreOrderTraverse(R->right());
}
void InOrderTraverse(BSTNode<E>* R){
    if(R==NULL)
        return;
    InOrderTraverse(R->left());
    cout<<R->element()<<' ';
    InOrderTraverse(R->right());
}
void PostOrderTraverse(BSTNode<E>* R){
    if(R==NULL)
        return;
    PostOrderTraverse(R->left());
    PostOrderTraverse(R->right());
    cout<<R->element()<<' ';
}
void PrintTree(BSTNode<E>* R,int Level){
    int i;
    if(R==NULL)return;
    PrintTree(R->right(),Level+1);
    for(i=0;i<3*Level;i++)
        cout<<' ';
    cout<<R->element()<<endl;
    PrintTree(R->left(),Level+1);
}
int leafCountOfBiTree(BSTNode<E>* R){
    if(R==NULL)
        return 0;
    if(R->isLeaf())
        return 1;
    return leafCountOfBiTree(R->left())+leafCountOfBiTree(R->right());
}
};
BSTNode<E>* CreateBiTree(){
    BSTNode<E> *R;
    E ch;
    cin>>ch;
    if(ch=='#'){
        R=NULL;
    }
    else{
    R = new BSTNode<E>;
    R->setElement(ch);
    R->setLeft(CreateBiTree());
    R->setRight(CreateBiTree());
    }
    return R;
}
int main(){
    BSTNode<E>* n;
    cout<<"请输入数据:";
    BSTree<char> bt;
    n=CreateBiTree();
    bt.setRoot(n);
    cout<<"层次遍历:";
    bt.LevelOrder(bt.getRoot());
    cout<<"\n前序遍历:";
    bt.PreOrderTraverse(bt.getRoot());
    cout<<"\n中序遍历:";
    bt.InOrderTraverse(bt.getRoot());
    cout<<"\n后序遍历:";
    bt.PostOrderTraverse(bt.getRoot());
    cout<<"\n树:\n";
    bt.PrintTree(bt.getRoot(),1);
    cout<<"结点总数"<<bt.count_treenode(bt.getRoot())<<endl;
    cout<<"树的高度:"<<bt.depthOfBiTree(bt.getRoot())<<endl;
    cout<<"叶子结点数:"<<bt.leafCountOfBiTree(bt.getRoot())<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zh1144237061/article/details/78694034
今日推荐