二叉排序樹的構造,插入,遍歷,查找,刪除

#include<iostream.h>
typedef char dataType;
       
class Node{
public:
    dataType data;
    Node* lchild;
    Node* rchild;
    Node(){
        lchild=NULL;
        rchild=NULL;
    }
    Node(dataType data){
        
        this->data=data;
        lchild=NULL;
        rchild=NULL;
    }
    ~Node(){}
};
class StackNode{
public:
    dataType data;
    Node* lchild;
    Node* rchild;
    Node* add;
};
class Tree{
private:
    Node* r;
    int n;
public:
    Node* root;
    Tree(){ root=NULL,n=0;}
    ~Tree(){}
    int countNum(){return n;}
    void display();//遞歸實現中序遍歷
    bool insertNode(dataType data);//插入結點
    bool delNode(char data);//刪除結點
    Node* findNode(dataType data);
    Node* findNode(dataType data,Node** pre);
    Node* findNode(dataType data,Node* &pre);
    void midDisplay();//非遞歸實現中序遍歷
};
//遞歸到非遞歸:自己構造一個類似遞歸中的棧(遞歸棧)
void Tree::midDisplay()
{
    StackNode stack[100];//棧中要存儲訪問過的結點(結點數據和結點地址)
    int i=-1;
    Node*  p=root;
    if(p!=NULL){
        //stack[++i]=p->data;//入棧
       // Node* temp=p->lchild;
        while(i>-1||p!=NULL){
                
            while(p!=NULL){
                    
                stack[++i].data=p->data;//數據入棧
                stack[i].add=p;//地址入棧
                p=p->lchild;
            }
        p=stack[i].add;//p指向棧頂
        cout<<stack[i--].data;//出棧並輸出
            
        p=p->rchild;
        }
    }
    else{cout<<"空樹!"<<endl;}
};
void Tree::display()//中序遍歷
{
    Node* p=root;
        
     if(p!=NULL)
    {
         Tree ltree;
         ltree.root=p->lchild;
        
         ltree.display();
         cout<<p->data;
          Tree rtree;
         rtree.root=p->rchild;
             
         rtree.display();
    }
         
}
bool Tree::delNode(dataType data){
    Node* pre=NULL;
    Node* p=findNode(data,&pre);
    if(p!=NULL){
            
        if(p->rchild==NULL&&p->lchild==NULL)
        {
            if(p==pre->rchild){pre->rchild=NULL;}
            else{pre->lchild=NULL;}
            delete(p);
        }
        else if(p->rchild==NULL&&p->lchild!=NULL)
        {
                
            if(p==pre->rchild){pre->rchild=p->lchild;}
            else{pre->lchild=p->lchild;}
            delete(p);
        }
       else if(p->lchild==NULL&&p->rchild!=NULL)
        {
            if(p==pre->rchild){pre->rchild=p->rchild;p=NULL;}
            else{pre->lchild=p->rchild;p=NULL;}
                
            delete(p);
        }
        else /*if(p->lchild!=NULL&&p->rchild!=NULL)*///左右子樹都有
        {
            Node* lp=p->lchild;
            Node* fpre;
            fpre=lp;
            while(lp->rchild!=NULL){
                
                fpre=lp;
                lp=lp->rchild;
            }
            p->data=lp->data;
                if(lp->rchild==NULL&&lp->lchild==NULL)
        {
            if(lp==fpre){p->lchild=NULL;}
            else{
                if(lp==fpre->rchild){fpre->rchild=NULL;}
                else{fpre->lchild=NULL;}
            }
            delete(lp);
        }
        else if(lp->rchild==NULL&&lp->lchild!=NULL)
        {
                
            if(lp==fpre->rchild){fpre->rchild=p->lchild;}
            else{fpre->lchild=lp->lchild;}
            delete(lp);
        }
       else /*if(p->lchild==NULL&&p->rchild!=NULL)*/
        {
            if(lp==fpre->rchild){fpre->rchild=lp->rchild;lp=NULL;}
            else{fpre->lchild=lp->rchild;lp=NULL;}
                
            delete(lp);
        }
            //delete(lp);
        }
            
        n--;
        return true;
    }
    return false;
}
Node* Tree::findNode(dataType data,Node** pre){//返回NULL說明沒有找到,pre爲找到的結點的父節點
    Node* p=root;
    *pre=NULL;
    while(p!=NULL){
            
        if(data==p->data){return p;}
        if(data>p->data){(*pre)=p;p=p->rchild;}
        else{(*pre)=p;p=p->lchild;}
                                    
            
    }
    return NULL;
}
Node* Tree::findNode(dataType data,Node* &pre){//返回NULL說明沒有找到,pre爲找到的結點的父節點
        
    Node* p=root;
    pre=NULL;
    while(p!=NULL){
            
        if(data==p->data){return p;}
        if(data>p->data){pre=p;p=p->rchild;}
        else{pre=p;p=p->lchild;}
            
            
    }
        
    return NULL;
}
Node* Tree::findNode(dataType data){
    Node* p=root;
    while(p!=NULL){
        if(p->data==data){return p;}
        if(data<p->data){p=p->lchild;}
        else{p=p->rchild;}
    }
    return NULL;
}
/*bool Tree::insertNode(dataType data){
    Node* p=root;
    Node* pre;
    if(p==NULL){Node* node=new Node(data);root=node;n++;return true;}
    while(p!=NULL){
        if(data==p->data){return false;}
        if(data>p->data){pre=p;p=p->rchild;}
        else{pre=p;p=p->lchild;}
        
    }
    if(p==NULL){
        Node* node=new Node(data);
        if(data>pre->data){pre->rchild=node;}
        else{pre->lchild=node;}
        n++;   
        return true;}
    return false;
        
           
}*/
bool Tree::insertNode(dataType data){
    Node* p=root;
    if(p==NULL){Node* node=new Node(data);root=node;n++;return true;}//確保pre不爲空,若沒有這句,插入第一個結點時,會得到一個爲空的pre指針,下面的if語句會出錯
    Node* pre=NULL;
    if(findNode(data,&pre)==NULL)
    {
        Node* node=new Node(data);
        if(data>pre->data){pre->rchild=node;}
        else{pre->lchild=node;}
        n++;
        return true;
    }
       
        
        
    return false;
        
        
}
void main()
{
    Tree tree;
    cout<<tree.countNum()<<endl;
       
    tree.insertNode('D');
    tree.insertNode(  'B' );
    tree.insertNode(  'C' );
    tree.insertNode(  'E' );
    for(int i=0;i<26;i++){tree.insertNode('A'+i);}
    tree.display(); cout<<endl;
    cout<<tree.countNum()<<endl;
    Node* pre=NULL;
    cout<<tree.findNode('A',&pre)->data<<endl;//二重指針傳參取指針的地址做參數
    if(pre!=NULL){
       cout<<"前一個數:"<<pre->data<<endl;
    }
    cout<<tree.findNode('A',pre)->data<<endl;//
    if(pre!=NULL){
            
        cout<<"前一個數:"<<pre->data<<endl;
    }
    cout<<tree.findNode('C')->data<<endl;
    tree.delNode('D');
    if(tree.findNode('D')==NULL){cout<<"沒有該數!"<<endl;}
    cout<<tree.countNum()<<endl;
    tree.display(); cout<<endl;
    tree.midDisplay(); cout<<endl;
       
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章