Treap 簡單的平衡二叉搜尋樹

2021-08-02 19:06:27 字數 2519 閱讀 6747

它基本的支援一下操作:

1. 插入x數

2. 刪除x數(若有多個相同的數,只刪除乙個)

3. 查詢x數的排名(若有多個相同的數,輸出最小的排名)

4. 查詢排名為x的數

5. 求x的前驅(前驅定義為小於x,且最大的數)

6. 求x的後繼(後繼定義為大於x,且最小的數)

模板如下:

#include

#include//有rand()[隨機函式]

#include

using

namespace

std;

struct treap

t[1000010];

int tot,m,root,ans;

inline

void update(int k)

//&k:節點編號

inline

void ll(int &k)

inline

void rr(int &k)

void insert(int &k,int num)

++t[k].size;

if(t[k].v==num) ++t[k].recy;

else

if(t[k].vif(t[t[k].r].rndelse

if(t[k].l*t[k].r==0) k=t[k].l+t[k].r;

else

if(t[t[k].l].rndelse ll(k),delet(k,num);

}else

if(num>t[k].v) --t[k].size,delet(t[k].r,num);

else --t[k].size,delet(t[k].l,num);

}int atrank(int k,int num)//尋找值為num的數的排名

int rerank(int k,int num)//尋找排名為num的數值

void pre(int k,int num)//找前驅

else pre(t[k].l,num);

}void suc(int k,int num)//找後繼

int main()

if(f==6)

}return

0;}

來道題:

bzoj1503 [noi2004]鬱悶的出納員

#include

#include

#include

using

namespace

std;

const

int maxn=100020;

int s[maxn],l[maxn],r[maxn],v[maxn],tot=0,rnd[maxn],n,m,pre,root,ans;

inline

void pushup(int k)

inline

void rturn(int &k)

inline

void lturn(int &k)

void ins(int &k,int num)

s[k]++;

if(numif(rnd[l[k]]else

else

}int find(int k,int x)

int main()

if(ch[0]=='f')

} printf("%d\n",ans);

return

0;}

以及poj2892『』鬼子進村『』(我同桌這樣叫的)

#include

#include

//#include

using

namespace

std;

int tot=0,n,m,root,l,r,last[60000],pop=0;

struct treap

t[60000];

inline

void update(int k)

inline

void ll(int &k)

inline

void rr(int &k)

void insert(int &k,int num)

t[k].size++;

if(num==t[k].v) t[k].recy++;

else

if(numif(t[k].rnd>t[t[k].l].rnd) rr(k);

}else

}void delet(int &k,int num)

else

if(t[k].l*t[k].r==0) k=t[k].l+t[k].r;

else}}

else

if(numelse --t[k].size,delet(t[k].r,num);

}void find(int k,int num)

if(c[0]=='r')

if(c[0]=='q')

}}int main()

隨機二叉搜尋樹 Treap

當個日記記錄treap這一結構,詳細參見http www.nocow.cn index.php treap,在這裡我著重講一下旋轉 treap,它其它就是乙個二叉查詢樹 bst 堆 heap 它的資料有兩個 關鍵值 key 優先順序 fix 用struct表示treap的結點的結構如下 struct...

動態平衡二叉搜尋樹的簡易實現,Treap 樹

treap 樹是一種易於實現的近似平衡的二叉搜尋樹。treap 每個結點包括值和優先順序兩個屬性,值滿足二叉搜尋樹性質 左 中 右 優先順序滿足大頂堆的性質 左 中 右 中 treap 樹的插入和刪除的實現比較簡單,插入結點時為待插結點隨機生產乙個優先順序值,按照bst的插入演算法並通過左旋或右旋調...

平衡二叉搜尋樹

二叉搜尋樹的問題 平衡 banlance 平衡 當節點數量固定時,左右子樹的高度越接近,這棵二叉樹就越平衡 高度越低 最理想的狀態就是像完全二叉樹 滿二叉樹那樣,高度是最小的。前提 節點的新增 刪除順序是無法限制的,可以認為是隨機的。改進方案 在節點的新增 刪除操作之後,想辦法讓二叉搜尋樹恢復平衡 ...