实现代码:
// 二叉树的先序中序后序实现
#include <iostream>
using namespace std;
template<class Elem>
struct BinNode{
Elem data;
BinNode<Elem>* left;
BinNode<Elem>* right;
BinNode(Elem x){
data=x;
left=right=NULL;
}
};
template<class Elem>
class BinTree{
protected:
BinNode<Elem>* root;
void rpreprint(BinNode<Elem>* r){ // 对于传指针,一定不要掉以轻心,要首先看一下指针是不是空指针
if(r==NULL) return;
cout<<r->data<<" ";
rpreprint(r->left);
rpreprint(r->right);
}
void rinprint(BinNode<Elem>* r){
if(r==NULL) return;
rinprint(r->left);
cout<<r->data<<" ";
rinprint(r->right);
}
void rpostprint(BinNode<Elem>* r){
if(r==NULL) return;
rinprint(r->left);
rinprint(r->right);
cout<<r->data<<" ";
}
int cntLeaves(BinNode<Elem>* r){
if(r==NULL) return 0;
if(r->left==NULL && r->right==NULL) return 1;
return cntLeaves(r->left)+cntLeaves(r->right);
}
BinNode<Elem>* rfindX(Elem x,BinNode<Elem>* r){
if(!r) return NULL;
if(r->data==x) return r;
BinNode<Elem>* found;
found=rfindX(x,r->left);
return found?found:rfindX(x,r->right);
}
void rprint(BinNode<Elem>* r,int depth){
for(int i=0;i<depth;i++) cout<<" ";
if(!r){
cout<<"[/]"<<endl;
}
else{
cout<<r->data<<endl;
rprint(r->left,depth+1);
rprint(r->right,depth+1);
}
}
public:
BinTree() {root=NULL;}
BinTree(Elem r){
root=new BinNode<Elem>(r);
}
~BinTree(){ };
void preprint(){
rpreprint(root);
cout<<endl;
}
void inprint(){
rinprint(root);
}
void postprint(){
rpostprint(root);
}
void print(){
rprint(root,0);
}
BinNode<Elem>* findX(Elem x){
return rfindX(x,root);
}
bool insert(Elem p,int LorR,Elem x){
BinNode<Elem>* found;
found=findX(p);
if(!found) return false;
if(LorR==0){
if(found->left) return false;
found->left=new BinNode<Elem>(x);
}
else{
if(found->right) return false;
found->right=new BinNode<Elem>(x);
}
return true;
}
int cnt(){
return cntLeaves(root);
}
};
int main(){
string name;
cin>>name;
BinTree<string> bt(name);
cin>>name;
while(name!="-"){
string lc,rc;
cin>>lc>>rc;
if(lc!="-") bt.insert(name,0,lc);
if(rc!="-") bt.insert(name,1,rc);
cin>>name;
}
cout<<"叶子数目:"<<bt.cnt()<<endl;
return 0;
}
/*
Ann
Ann Bill Chris
Bill Daisy Ellen
Chric - Flin
Dasiy - -
Ellen Grace Henry
Flin - -
Grace - -
Henry - -
-
*/