#include<iostream>
using namespace std;
template<class T>
struct Binode //节点
{
T data;
Binode<T> *lch;
Binode<T> *rch;
};
template<class T> //树
class Bitree
{
private:
void create(Binode<T>*&R,T data[],int i);
void Destroy(Binode<T> *R);
public:
Binode<T>* root;
Bitree(T data[]);
void preorder(Binode<T>*R); //前序
void Inorder(Binode<T>*R); //中序
void Postorder(Binode<T>*R); //后序
void Levelorder(Binode<T>*R); //层序
int Depth(Binode<T> *R,int d); //深度
void path(Binode<T>* root,char); //路径
~Bitree(); //销毁
};
template<class T>
void Bitree<T>::create(Binode<T>*&R,T data[],int i) //递归建立二叉树
{
if(data[i-1]!=0)
{
R=new Binode<T>;
R->data=data[i-1];
R->lch=R->rch=NULL;
create(R->lch,data,2*i);
create(R->rch,data,2*i+1);
}
}
template<class T>
Bitree<T>::Bitree(T data[]) //构造函数
{
create(root,data,1);
}
template<class T>
void Bitree<T>::preorder(Binode<T>*R) //前序遍历
{
if(R!=NULL)
{
cout<<R->data;
preorder(R->lch);
preorder(R->rch);
}
}
template<class T>
void Bitree<T>::Inorder(Binode<T>*R) //中序遍历
{
if(R!=NULL)
{
Inorder(R->lch);
cout<<R->data;
Inorder(R->rch);
}
}
template<class T>
void Bitree<T>::Postorder(Binode<T>*R) //后序遍历
{
if(R!=NULL)
{
Postorder(R->lch);
Postorder(R->rch);
cout<<R->data;
}
}
template<class T>
void Bitree<T>::Levelorder(Binode<T>*R) //层序遍历
{
Binode<T>* queue[10000];
int f=0,r=0;
if(R!=NULL) queue[++r]=R;
while(f!=r)
{
Binode<T>*p=queue[++f];
cout<<p->data;
if(p->lch!=NULL) queue[++r]=p->lch;
if(p->rch!=NULL) queue[++r]=p->rch;
}
}
template <class T>
void Bitree<T>::Destroy(Binode<T> *R) //销毁二叉树
{
if (R!=NULL)
{
Destroy(R->lch);
Destroy(R->rch);
delete R;
}
}
template <class T>
Bitree<T>::~Bitree() //析构函数
{
Destroy(root);
}
template <class T>
int Bitree<T>::Depth(Binode<T> *R,int d) //求深度
{
if (R==NULL) return d;
if ((R->lch==NULL) && (R->rch==NULL))
return d+1;
else
{
int m = Depth(R->lch,d+1);
int n = Depth(R->rch,d+1);
return n>m? n:m;
}
}
template<class T>
void Bitree<T>::path(Binode<T>* root,char m)//求路径
{
Binode<T>* stack[10000];
Binode<T>* s;
Binode<T>*s;
int tag[10000];
int top=0;
s=root;
do
{
while(s!=NULL)
{
top++;
stack[top]=s;
tag[top]=0;
s=s->lch;
}
if(top> 0)
{
if(tag[top]==1)
{
if(stack[top]->data==m)
{
cout<<"路径: ";
for(int i=1;i<=top;i++)
cout<<stack[i]->data;
break;
}
top--;
}
else s=stack[top];
if(top>0)
{
s=s->rch;
tag[10000];
int top=0;
s=root;
do
{
while(s!=NULL)
{
top++;
stack[top]=s;
tag[top]=0;
s=s->lch;
}
if(top> 0)
{
if(tag[top]==1)
{
if(stack[top]->data==m)
{
cout<< "路径: ";
for(int i=1;i <=top;i++)
cout<<stack[i]->data;
break;
}
top--;
}
else
{
s=stack[top];
if(top> 0)
{
s=s->rch;
tag[top]=1;
}
}
}
}
while(s!=NULL||top!=0);
}
void main()
{
char buf[400]={0};
for(int i = 0;i<5;i++)
buf[i] = i+65;
Bitree<char> ChBiTree(buf);
cout<<"前序遍历:"<<endl;
ChBiTree.preorder(ChBiTree.root);
cout<<endl;
cout<<"中序遍历:"<<endl;
ChBiTree.Inorder(ChBiTree.root);
cout<<endl;
cout<<"后序遍历:"<<endl;
ChBiTree.Postorder(ChBiTree.root);
cout<<endl;
cout<<"层序遍历:"<<endl;
ChBiTree.Levelorder(ChBiTree.root);
cout<<endl;
cout<<"深度为"<<ChBiTree.Depth(ChBiTree.root,0)<<endl;
ChBiTree.path(ChBiTree.root,buf[4]);
}