C++ 数据结构-------二叉树实现

最近写了一个简单的二叉树,仅供查考,代码如下:

#include <iostream>
using namespace std;

typedef char T;

class bst
{
    struct Node
    {
        T data;
        Node* L;
        Node* R;
        Node(const T& d):data(d),L(),R(){}
        Node(const T& d,Node* l,Node* r):data(d),L(l),R(r){}
    };
    typedef Node* tree;
    Node* rp;
    int n;
public:
    bst():rp(),n(){}
    ~bst()
    {
        clear();
    }
    void clear()
    {
        clear(rp);
        n = 0;
    }
    void insert(const T& d)
    {
        insert(rp,new Node(d));
        ++n;
    }
    tree& find(const T& d)
    {
        return find(rp,d);
    }
    void travel()const
    {
        travel(rp);
        cout << endl;
    }
    bool empty()const
    {
        return rp == NULL;
    }
    int size()const
    {
        return n;
    }
    bool remove(const T& d) //删除树中指定数值的节点
    {
        tree& t = find(d);
        if(t == NULL) return false;
        Node* p = t;
        if(t->L != NULL) insert(t->R,t->L);
        t = t->R;
        delete p;
        --n;
        return true;
    }
    const T& root()const
    {
        if(rp == NULL) throw "空";
        return rp->data;
    }
    void update(const T& olddata,const T& newdata) //修改节点的数据    
    {
        if(remove(olddata))
          insert(newdata);
    }
private:
    static void insert(tree& t,Node* p) //在树中插入一个节点
    {
        if(t == NULL)
          t = p;
        else if(p->data < t->data)
          insert(t->L,p);
        else
          insert(t->R,p);
    }
    static tree& find(tree& t,const T& d)  //返回已d为根节点的子树的根指针
    {
        if(t == NULL) return t; //没找到
        else if(t->data == d) return t; //找到了
        else if(d < t->data)
          return find(t->L,d);
        else
          return find(t->R,d);
    }
    static void travel(tree t) //遍历
    {
        if(t != NULL)
        {
            travel(t->L);
            cout << t->data << ' ';
            travel(t->R);
        }
    }
    static void clear(tree& t) //清空
    {
        if(t != NULL)
        {
            clear(t->L);
            clear(t->R);
            delete t;
            t = NULL;
        }
    }
    static int high(tree t)
    {
        if(t == NULL) return 0;
        int lh = high(t->L);
        int rh = high(t->R);
        return 1+(lh>rh?lh:rh);
    }
};


int main()
{
    bst b;
    b.insert('k');
    b.insert('s');
    b.insert('f');
    b.insert('t');
    b.insert('a');
    b.insert('m');
    b.insert('x');
    b.insert('e');

    b.travel();
    
    b.remove('k');
    b.travel();

    b.update('x','*');
    b.travel();

    while(!b.empty())
      b.remove(b.root());
    cout << "size: " << b.size() << endl;
    
    b.travel();

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值