数据结构实验五 信管117121刘愿

实验5:树和二叉树的实验2

#include<iostream>    
using namespace std;    
    
template <class T>    
struct BiNode    
{    
    T data;    
    BiNode<T> *lchild,*rchild;    
};    
    
template <class T>    
class Bitree    
{    
    public:    
        Bitree() { root=Creat(root); }   
        ~Bitree() { Release(root); }    
        void Preorder() { Preorder(root); }    
        void Inorder() { Inorder(root); }    
        void Postorder() { Postorder(root); }     
        void Leverorder();     
        void message(T x){ message(root,x); }   
    private:    
        BiNode<T> *root;   
        BiNode<T> *Creat(BiNode<T> *bt);   
        void Release (BiNode<T> *bt);    
        void Preorder (BiNode<T> *bt);    
        void Inorder (BiNode<T> *bt);    
        void Postorder (BiNode<T> *bt);    
        void message(BiNode<T> *bt,T x);    
        void Parent(BiNode<T> *bt,T x);    
};    
    
template <class T>    
void Bitree<T>::Preorder(BiNode<T> *bt)    
{    
    if(bt==NULL) return;     
    else {    
        cout<<bt->data<<" ";    //访问根结点的数据域    
        Preorder(bt->lchild);  //前序递归遍历左子树    
        Preorder(bt->rchild);  //前序递归遍历右子树    
    }    
}    
    
template <class T>    
void Bitree<T>::Inorder(BiNode<T> *bt)    
{    
    if(bt==NULL) return;     
    else {    
        Inorder(bt->lchild);  //中序递归遍历左子树    
        cout<<bt->data<<" ";    //访问根结点的数据域    
        Inorder(bt->rchild);  //中序递归遍历右子树    
    }    
}    
    
template <class T>    
void Bitree<T>::Postorder(BiNode<T> *bt)    
{    
    if(bt==NULL) return;    
    else {    
        Postorder(bt->lchild);  //后序递归遍历左子树    
        Postorder(bt->rchild);  //后序递归遍历右子树    
        cout<<bt->data<<" ";    //访问根结点的数据域    
    }    
}    
    
template <class T>    
void Bitree<T>::Leverorder()    
{    
    front = rear =-1;   
    if(root == NULL) return;   
    Q[++rear] = root;    
    while(front!=rear)    
    {    
        q=Q[++front];    
        cout<<q->data;    
        if(q->lchild !=NULL) Q[++rear]=q->lchild;    
        if(q->rchild !=NULL) Q[++rear]=q->rchild;    
    }    
}    
    
template <class T>    
BiNode<T> *Bitree<T>::Creat(BiNode<T> *bt)    
{    
    char ch;    
    cout<<"前序遍历输入扩展二叉树的各个结点数据,输入#为空 :"<<endl;    
    cin>>ch;    
    if(ch=='#') bt=NULL;    
    else {    
        bt= new BiNode<T>; bt->data = ch;    
        bt->lchild=Creat(bt->lchild);    
        bt->rchild=Creat(bt->rchild);    
            
    }    
    return bt;    
}    
    
template <class T>    
void Bitree<T>::Release(BiNode<T> *bt)    
{    
    if(bt!=NULL)  
    {    
        Release(bt->lchild);    
        Release(bt->rchild);    
        delete bt;    
    }    
}    
    
template <class T>    
void Bitree<T>::message(BiNode<T> *bt,T x)    
{    
    int data;    
    if(bt==NULL) return;    
    else{    
        if(bt->data==x)  
        {    
            cout<<"结点"<<bt->data<<endl;    
            if(bt->lchild!=NULL) cout<<"左孩子为:"<<bt->lchild->data<<endl;      
            else cout<<"无左孩子"<<endl;      
            if(bt->rchild!=NULL) cout<<"右孩子为:"<<bt->rchild->data<<endl;    
            else cout<<"无右孩子"<<endl;      
            if(bt==root)  cout<<"该结点为根,无双亲"<<endl;      
            else   Parent(root,x);    
        }    
        else{      
             message(bt->lchild,x);      
             message(bt->rchild,x);      
        }    
    }    
}    
    
template<class T>      
void Bitree<T>::Parent(BiNode<T> *bt,T x)      
{      
    if(bt==NULL) return;      
    else      
    {      
        if(bt->lchild->data==x||bt->rchild->data==x)  
            cout<<"双亲为:"<<bt->data<<endl;      
        else{      
            Parent(bt->lchild,x);      
            Parent(bt->rchild,x);      
        }      
    }      
}    
    
void main()    
{    
    char x; int q;    
    Bitree<char>s;    
    cout<<"前序遍历二叉树:"<<endl;    
    s.Preorder();    
    cout<<endl;    
    cout<<"中序遍历二叉树:"<<endl;    
    s.Inorder();    
    cout<<endl;    
    cout<<"后序遍历二叉树:"<<endl;    
    s.Postorder();    
    cout<<endl;    
    cout<<"输出结点信息:"<<endl;    
    for(int i=0;i=1;i=q)  
    {    
        cout<<"请输入需要查询的结点元素"<<endl;    
        cin>>x;    
        s.message(x);    
        cout<<"是否需要继续查询结点元素?"  
            <<endl<<"是:1      否:0"<<endl;    
        cin>>q;    
        if (q==0) break;    
    }    

}    


猜你喜欢

转载自blog.csdn.net/qq920896923/article/details/80357512