1.各种不同的遍历函数、求二叉树的高度函数、求二叉树所有结点函数、求二叉树所有叶子结点函数的算法设计。
代码如下(示例):
#include<iostream>
using namespace std;
#define max 16
template <typename T>
struct biNode{
biNode<T> *lChild,*rChild;
T data;
};
template <typename T>
class biTree{
biNode<T> *root;
public:
biTree(){
char ch;
cin>>ch;
biNode<T> *Q[max];
biNode<T> *s;
int rear=0,front=1;
root=NULL;
while(ch!='#'){
s=NULL;
if(ch!='@'){
s=new biNode<T>;
s->data=ch;
s->lChild=s->rChild=NULL;
}
Q[++rear]=s;
if(rear==1) root=s;
else{if(s){
if(rear%2==0) Q[front]->lChild=s;
else Q[front]->rChild=s;
}
if(rear%2) front++;}
cin>>ch;
}
}
void preOrder(biNode<T> *rt){
if(rt){
cout<<rt->data;
preOrder(rt->lChild);
preOrder(rt->rChild);
}
}
void inOrder(biNode<T> *rt){
if(rt){
preOrder(rt->lChild);
cout<<rt->data;
preOrder(rt->rChild);
}
}
void postOrder(biNode<T> *rt){
if(rt){
preOrder(rt->lChild);
preOrder(rt->rChild);
cout<<rt->data;
}
}
void levelOrder(){
int front=-1,rear=-1;
biNode<T> *Q[max];
if(root) Q[++rear]=root;
while(front!=rear){
biNode<T> *s=Q[++front];
cout<<s->data<<" ";
if(s->lChild) Q[++rear]=s->lChild;
if(s->rChild) Q[++rear]=s->rChild;
}
cout<<endl;
}
int high(biNode<T> *rt){
if(rt==0) return 0;
else{
int lh,rh;
lh=high(rt->lChild);
rh=high(rt->rChild);
return 1+(lh>rh?lh:rh);
}
}
int numAllLeaf(biNode<T> *rt){
if(rt==0) return 0;
else if(rt->lChild==NULL&&rt->rChild==NULL) return 1;
else {
return numAllLeaf(rt->lChild)+numAllLeaf(rt->rChild);
}
}
int numAllNode(biNode<T> *rt){
if(rt==0) return 0;
else return 1+numAllNode(rt->lChild)+numAllNode(rt->rChild);
}
void deTree(biNode<T> *rt){
if(rt){
deTree(rt->lChild);
deTree(rt->rChild);
delete rt;
}
}
~biTree(){ deTree(root);}
biNode<T> *getRoot(){
return root;
}
};
int main(){
biTree<char> b1;
cout<<"先序遍历序列:";
b1.preOrder(b1.getRoot());
cout<<'\n';
cout<<"中序遍历序列:";
b1.inOrder(b1.getRoot());
cout<<'\n';
cout<<"后序遍历序列:";
b1.postOrder(b1.getRoot());
cout<<'\n';
cout<<"层序遍历序列:";
b1.levelOrder();
cout<<"二叉树高度为:"<<b1.high(b1.getRoot())<<endl;
cout<<"二叉树所有叶子结点个数为:"<<b1.numAllLeaf(b1.getRoot())<<endl;
cout<<"二叉树所有结点个数为:"<<b1.numAllNode(b1.getRoot())<<endl;
return 0;
}
总结
1.数据成员指针root是私有访问权限,不能在类外被访问。然而,在主函数做测试时,又需要用到root来做实参,因此,需要在类中定义一个函数来返回指针root。
2.在写析构函数时,由于析构函数不能有参数,而刚好又需要用到递归的方法来实现,因此,
需要先写一个递归函数。然后再在析构函数体内来调用这个递归函数,以实现功能。