欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Treap樹的C++類實現(xiàn)-創(chuàng)新互聯(lián)

Treap:

創(chuàng)新互聯(lián)建站服務(wù)項目包括東鄉(xiāng)族網(wǎng)站建設(shè)、東鄉(xiāng)族網(wǎng)站制作、東鄉(xiāng)族網(wǎng)頁制作以及東鄉(xiāng)族網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,東鄉(xiāng)族網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到東鄉(xiāng)族省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

一種數(shù)據(jù)結(jié)構(gòu),結(jié)合了二叉搜索樹和堆的特點,為了避免BST樹插入有序數(shù)列時一邊樹過高的問題,引入了隨機權(quán)值,在插入時進行隨機權(quán)值的比較來進行左旋右旋的操作,進而達到平衡的效果,目的與avl類似,但操作方便,代碼更加簡潔。支持插入節(jié)點、刪除節(jié)點、求第x大的節(jié)點、求權(quán)值為x的節(jié)點的排名、求權(quán)值比x小的大節(jié)點、求權(quán)值比x大的最小節(jié)點

除建樹外,各操作時間復(fù)雜度均為O(logn)

#include#include#include#include#includeusing namespace std;

struct Node {
    int data;
    Node *left;
    Node *right;
    int priority;
    int size;
    int cnt;
    Node(int value, int level) : data(value), left(NULL), right(NULL), priority(level), size(1), cnt(1) {}
};

class Treap {
private:
    Node *root;
    void leftRotate(Node* &p);                  //左旋
    void rightRotate(Node* &p);                 //右旋
    void insert(Node* &p, int value);           //插入節(jié)點的遞歸寫法
    void remove(Node* &p, int value);           //刪除節(jié)點的遞歸寫法
    int get_rank_by_value(Node* &p, int value); //通過排名獲取節(jié)點值的遞歸寫法
    int get_value_by_rank(Node* &p, int rank);  //通過節(jié)點值獲取排名的遞歸寫法
    int get_prev(Node* &p, int value);          //找到節(jié)點的前驅(qū)的遞歸寫法
    int get_next(Node* &p, int value);          //找到節(jié)點的后繼的遞歸寫法
    void pushup(Node* &p);                      //更新節(jié)點的參數(shù)
public:
    Treap();
    void insert(int value);
    void remove(int x);
    bool search(int x);
    int get_rank_by_value(int value);
    int get_value_by_rank(int rank);
    int get_prev(int value);
    int get_next(int value);
    bool empty();                               //判斷是否樹為空
};

Treap::Treap() {
    root = NULL;
}

void Treap::pushup(Node* &p){
    if(!p) return;
    p->size = 0;
    if(p->left) p->size += p->left->size;
    if(p->right) p->size += p->right->size;
    p->size += p->cnt;
}

void Treap::leftRotate(Node* &p) {
    Node *k = p->right;
    p->right = k->left;
    k->left = p;
    p = k;
    pushup(p->left);
    pushup(p);
}

void Treap::rightRotate(Node* &p) {
    Node *k = p->left;
    p->left = k->right;
    k->right = p;
    p = k;
    pushup(p->right);
    pushup(p);
}

void Treap::insert(int value) {
    insert(root, value);
}

void Treap::insert(Node* &p, int value) {
    if (p == NULL) {
        p = new Node(value, rand());
    }
    else if (value == p->data) p->cnt++;
    else if (value< p->data) {
        insert(p->left, value);
        if(p->left && p->left->priority >p->priority) rightRotate(p);
    }
    else{
        insert(p->right, value);
        if(p->right && p->right->priority< p->priority) leftRotate(p);
    }
    
    pushup(p);
}

void Treap::remove(int value) {
    remove(root, value);
}

void Treap::remove(Node* &p, int value) {
    if(!p){cout<<"invalid value!"<data == value) {
        if (p->left == NULL) {
            p = p->right;
        } else if (p->right == NULL) {
            p = p->left;
        } else {
            if (p->left->priority >p->right->priority) {
                rightRotate(p);
                remove(p->right, value);
            } else if (p->left->priority< p->right->priority) {
                leftRotate(p);
                remove(p->left, value);
            }
        }
    } else {
        if (value< p->data) {
            remove(p->left, value);
        } else {
            remove(p->right, value);
        }
    }
    pushup(p);
}

bool Treap::search(int value) {
    Node *p = root;
    while (p) {
        if (p->data == value) {
            return true;
        } else {
            p = p->data< value ? p->right : p->left;
        }
    }
    return false;
}

bool Treap::empty(){
    return root == nullptr ? true : false;
}

int Treap::get_rank_by_value(Node* &p, int value){
    if(!p) return -1;
    int l = 0;
    if(p->left) l = p->left->size;
    if(p->data == value) return l + 1;
    if(p->data >value) return get_rank_by_value(p->left, value);
    return l + p->cnt + get_rank_by_value(p->right, value);
}

int Treap::get_rank_by_value(int value){
    return get_rank_by_value(root, value);
}

int Treap::get_value_by_rank(Node* &p, int rank){
    if(!p) return INT_MAX;
    int l = 0;
    if(p->left) l = p->left->size;
    if(l >= rank) return get_value_by_rank(p->left, rank);
    if(l + p->cnt >= rank) return p->data;
    return get_value_by_rank(p->right, rank - l - p->cnt);
}

int Treap::get_value_by_rank(int rank){
    return get_value_by_rank(root, rank);
}

int Treap::get_prev(Node* &p, int value){
    if(!p) return -INT_MAX;
    if(p->data >= value) return get_prev(p->left, value);
    return max(p->data, get_prev(p->right, value));
}

int Treap::get_prev(int value){
    return get_prev(root, value);
}

int Treap::get_next(Node* &p, int value){
    if(!p) return INT_MAX;
    if(p->data<= value) return get_next(p->right, value);
    return min(p->data, get_next(p->left, value));
}

int Treap::get_next(int value){
    return get_next(root, value);
}

測試代碼:

int main(int argc, char const *argv[]) {
    Treap treap;
    int N;
    cout<<"input len: ";
    cin>>N;
    cout<>value;
        treap.insert(value);
    }
    cout<>query;
        cout<<"value "<

測試結(jié)果:

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

新聞名稱:Treap樹的C++類實現(xiàn)-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://www.chinadenli.net/article46/dcschg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)品牌網(wǎng)站建設(shè)做網(wǎng)站微信小程序靜態(tài)網(wǎng)站品牌網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)