資料結構 Treap

2021-07-10 05:02:43 字數 1810 閱讀 9641

前兩天看了byvoid大神寫的treap的**,**中幾乎給出了所有的**,不過最後一部提到了乙個優化,就是對於重複的元素採用在同乙個節點中記錄乙個weight來記錄者個元素使用了多少次的寫法,以及查詢第k個數的功能的實現,我試著寫了乙個,表示樹旋轉之後需要重新設定size有一點點煩。因為找不到合適的題目去測試這段**,主要是因為這裡採用動態記憶體分配導致**執行速度很慢總是tle,我自己做了一下測試,不過目前只測試了插入功能和查詢功能。刪除功能,查詢第k個數的功能,給定乙個數給出排名的功能還沒有測試過。目標是最終實現乙個類似與stl中map的模板類,同時寫出乙個acm競賽中可用的treap模板(取消記憶體動態分配,採用陣列靜態儲存)。

先把**掛上來先,測試什麼的慢慢來。

已經證實一開始的**是有錯的,treap的刪除操作中,當找到節點時那個--cnt==0的判斷條件需要改一下,因為整個過程涉及遞迴,在下一步遞迴時再次--,cnt就會變成負數。

這只能算個補丁,應該有更好的寫法。

# include # include # include # include # include # include # include # include # include # include # include # include # include using namespace std;

const int debug = 0;

const int size = 1000000 + 10;

typedef long long ll;

# ifndef online_judge

struct desktopio

}dio;

# endif

struct treap_node

treap_node(int _value):value(_value),cnt(0),size(0),left(null),right(null){}

}*root = null;

inline void treap_setsize(treap_node *&p)

}inline int lsize(treap_node *&p)

inline int rsize(treap_node *&p)

void treap_left_rotate(treap_node *&a)

void treap_right_rotate(treap_node *&a)

void treap_insert(treap_node *&p,int value)

if (value < p->value)

else if (p->value < value)

else

treap_setsize(p);

}bool treap_delete(treap_node *&p,int value)

else

else if (p->left->fix < p->right->fix)

else

}} treap_setsize(p);

} return ret;

}treap_node* treap_find(treap_node* root,int value)

return root;

}treap_node* treap_findkth(treap_node *&p,int k)

int treap_rank(treap_node *p,int value,int cur)

void treap_clear(treap_node *&root)

int main()

while (m--)

} return 0;

}

資料結構之Treap

1.概述 同splay tree一樣,treap也是乙個平衡二叉樹,不過treap會記錄乙個額外的資料,即優先順序。treap在以關鍵碼構成二叉搜尋樹的同時,還按優先順序來滿足堆的性質。因而,treap tree heap。這裡需要注意的是,treap並不是二叉堆,二叉堆必須是完全二叉樹,而trea...

模板 資料結構 Treap

還有人把treap叫做樹堆的,但是常用名還是叫做treap的比較多。不進行任何封裝的,帶求和操作的,乙個節點存放多個元素的最普通的treap。includeusing namespace std typedef long long ll define ls ch id 0 define rs ch ...

演算法 資料結構 Treap

treap 完整版 struct treap void pushup int u void rotate int u,int d void inserthelp int u,ll v,ll c else if v val u else pushup u void removehelp int u,l...