二叉搜索樹C++實現

這個數據結構思想很易懂,

對任意數據放入ADT中,如果比某個節點的值大,則向右面遞歸放入,反之~

本來沒打算寫這個程序,但是在看書的時候,感覺書上有的地方好像有問題

來才發現,我是徹徹底底地錯了~!

紙上得來終覺淺,絕知此事要躬行!

實現程序如下:

#include
using namespace std;

template class BST;

template
class BTnode
{
    friend class BST;

public:

    BTnode():leftch(NULL),rightch(NULL){};
    BTnode(const T x):data(x),leftch(NULL),rightch(NULL){};
    ~BTnode(){};

protected:
    T data;
    BTnode *leftch;
    BTnode *rightch;
};

template
class BST
{
public:
    BST():root(NULL){};
    BST(T x);
    ~BST(){};

 

    void InserT(const T da,BTnode* &ptr);
    void RemovE(const T &da,BTnode* &ptr);
    void makempty(BTnode* &ptr);
    void prints(BTnode * ptr);//中序打印
    BTnode *FinD(const T da,BTnode *ptr)const;
    BTnode *maxval(BTnode *ptr)const;
    BTnode *minval(BTnode *ptr)const;
    BTnode * &getroot(){return root;};
private:
    BTnode* root;
    T Val;
};

template
BST::BST(T x)
{
    T da;
    root=NULL;
    Val=x;
    cin>>da;
    while(da!=Val)
    {
        InserT(da,root);
        cin>>da;
    }
}

template
void BST::InserT(const T da,BTnode* &ptr)
{
    if(ptr==NULL)
    {
        ptr=new BTnode(da);
        if(!ptr)
        {
            cerr<<"No Space for a new node"<

template
BTnode * BST::FinD(const T da,BTnode *ptr)const
{
    if(!ptr) return NULL;
    else  if(da< ptr->data)
        return FinD(da,ptr->leftch);
    else if(da>ptr->data)
        return FinD(da,ptr->rightch);
    else return ptr;
}

template
BTnode * BST::minval(BTnode *ptr) const
{
    if(!ptr) return NULL;
    while(ptr->leftch)    ptr=ptr->leftch;
    return ptr;
}

template
void BST::RemovE(const T &da, BTnode * &ptr)
{
    BTnode* temp;
    if(ptr)
    {
        if(da data) RemovE(da,ptr->leftch);
        else if(da> ptr->data) RemovE(da,ptr->rightch);
        else if(ptr->leftch && ptr->rightch)
        {
            temp=minval(ptr->rightch);
            ptr->data=temp->data;
            RemovE(ptr->data,ptr->rightch);
        }
        else
        {
            temp=ptr;
            if(ptr->leftch==NULL) ptr=ptr->rightch;
            else if(ptr->rightch==NULL) ptr=ptr->leftch;
            delete temp;
        }
    }

}

template
void BST::prints(BTnode *ptr)
{
    BTnode *temp=ptr;
    if(temp!=NULL)
    {
        prints(temp->leftch);
        cout<data<<"/t";
        prints(temp->rightch);
    }

}

int main()
{
    BST mybst(-1);//-1是輸入結束標誌符
    BTnode * &pt=mybst.getroot();
    mybst.prints(pt);

    mybst.RemovE(15,pt);
        cout<

    mybst.InserT(20,pt);
    cout<

示例數據:53 15 9 45 23 78 65 94 81 88 -1

發佈了53 篇原創文章 · 獲贊 4 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章