二叉搜索树C++实现

22 篇文章 0 订阅

这个数据结构思想很易懂,

对任意数据放入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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值