类封装得还是不错的,个人觉得,都是老师逼出来的。。。
#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;
}