• tree


    #include <iostream>
    using namespace std;

    typedef int T;
    class bst
    {
    struct Node{
    T data;
    Node* left;
    Node* right;
    Node(const T& d):data(d),left(),right(){}
    ~Node(){cout<<"~Node"<<endl;}
    };
    Node* root;
    typedef Node* tree;
    int sz;

    void clear(tree& t){
    if(t==NULL) return;
    clear(t->left);
    clear(t->right);
    delete t;
    t=NULL;

    }
    void insert(Node* pn,tree& t){
    if(pn==NULL) return;
    if(t==NULL) t=pn;
    else
    {
    if(pn->data >= t->data)
    insert(pn,t->right);
    else
    insert(pn,t->left);
    }
    }
    void travel(tree& t){
    if(t==NULL) return;
    travel(t->left);
    cout<<t->data<<' ';
    travel(t->right);
    }

    tree& find(tree& t,const T& d){
    if(t==NULL) return t;
    if(t->data==d) return t;
    if(t->data<d) return find(t->right,d);
    return find(t->left,d);
    }
    int high(tree& t){
    if(t==NULL) return 0;
    int left=high(t->left);
    int right=high(t->right);
    return left>right?left+1:right+1;
    }
    public:
    bst():root(),sz(){}

    void clear(){
    clear(root);
    sz=0;
    }
    ~bst(){
    clear();
    sz=0;
    }
    void insert(const T& d){
    Node* pn=new Node(d);
    insert(pn,root);
    sz++;
    }
    void travel(){
    travel(root);
    cout<<endl;
    }
    //查找一个元素,返回bst::Node*&类型,如果找不到返回空
    tree& find(const T& d){
    find(root,d);
    }
    //删除一个元素
    bool remove(const T& d){
    tree& t=find(root,d);
    if(t==NULL) return false;
    insert(t->left,t->right);
    Node* p =t;
    t = t->right;
    delete p;
    sz--;
    return true;
    }
    void removeAll(const T& d){
    while(remove(d));

    }
    void update(const T& old,const T& newd){
    while(remove(old)) insert(newd);
    }
    int size(){
    return sz;
    }
    int hight()
    {
    high(root);
    }
    };

    int main()
    {
    bst t;
    t.insert(4);
    t.insert(3);
    t.insert(6);
    t.insert(9);
    cout<<t.hight()<<endl;
    t.travel();
    cout<<t.find(1)<<endl;
    t.remove(3);
    t.travel();
    t.update(4,5);
    t.insert(12);
    t.insert(34);
    t.insert(5);
    t.insert(6);
    t.insert(5);
    t.travel();
    t.removeAll(5);
    t.travel();
    cout<<t.size()<<endl;
    cout<<t.hight()<<endl;
    t.clear();

    }

  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/xiaomaogong/p/3040071.html
Copyright © 2020-2023  润新知