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

来源:互联网 发布:php排序算法 编辑:程序博客网 时间:2024/04/29 03:33

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

#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;
}


1 0
原创粉丝点击