zoukankan      html  css  js  c++  java
  • BST

    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    struct treapNode {
        int val,ra;
        treapNode *left,*right;
    };
    
    void rightRoate(treapNode *&root) {
        treapNode *right = root->right;
        root->right = right->left;
        right->left = root;
        root = right;
    }
    
    void leftRoate(treapNode *&root) {
        treapNode *left = root->left;
        root->left = left->right;
        left->right = root;
        root = left;
    }
    
    void insert(treapNode *&root,int val) {
        if(!root) {
            root = new treapNode;
            root->val = val;
            root->ra = rand()*rand();
            root->left = root->right = NULL;
            return;
        }
        if(val <= root->val) {
            insert(root->left,val);
            if(root->ra > root->left->ra) {
                leftRoate(root);
            }
        }
        else {
            insert(root->right,val);
            if(root->ra > root->right->ra) {
                rightRoate(root);
            }
        }
    }
    
    treapNode** find(treapNode *&root,int val) {
        if(!root) {
            return NULL;
        }
        if(val == root->val) {
            return &root;
        } else if(val < root->val) {
            return find(root->left,val);
        } else {
            return find(root->right,val);
        }
    }
    
    void erase(treapNode *&root) {
        if(!root->left) {
            treapNode* tmp = root;
            root = root->right;
            delete tmp;
            return;
        } 
        if(!root->right) {
            treapNode *tmp = root;
            root = root->left;
            delete tmp;
            return;
        }
        if(root->left->ra > root->right->ra) {
            rightRoate(root);
            erase(root->left);
        } else {
            leftRoate(root);
            erase(root->right);
        }
    }
    
    
    void destroyTreap(treapNode *&root,bool &first) {
        if(!root) {
            return;
        }
        destroyTreap(root->left,first);
        if(!first) printf(" ");
        printf("%d",root->val);
        first = false;
        destroyTreap(root->right,first);
        //root->left = root->right = NULL;
        //delete root;
    }
    
    int main() {
        int n;
        treapNode*root;
        while(scanf("%d",&n)==1) {
            root = NULL;
            for(int i=0,x;i<n;i++) {
                scanf("%d",&x);
                insert(root,x);
            }
            bool first = true;
            destroyTreap(root,first);
            printf("
    ");
            for(int x;scanf("%d",&x) == 1;) {
                treapNode **tmp = find(root,x);
                if(!tmp) {
                    printf("not exist
    ");
                    continue;
                }
                printf("find %d
    ",(*tmp)->val);
                erase(*tmp);
                destroyTreap(root,first);
                printf("
    ");
            }
        }
    }

     详细讲解:

    树堆 - wiki

  • 相关阅读:
    数据库级触发器
    Erstudio8.0怎么用?Erstudio8.0汉化版详细使用教程
    Excel 信息对比_数组版
    百万级数据查询优化(数据库)
    sql查询重复记录、删除重复记录方法大全
    工作表(Worksheet)基本操作应用示例
    cxgrid中,如何根据列名或字段名取得footer值
    cxGrid使用汇总
    Delphi XE5通过WebService开发Web服务端和手机客户端
    cxGrid 锁定列
  • 原文地址:https://www.cnblogs.com/cdyboke/p/7795301.html
Copyright © 2011-2022 走看看