10.25(周三)

#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]);

}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值