樹堆，是電腦科學中術語。是有一個隨機附加域滿足堆的性質的二叉搜尋樹，其結構相當於以隨機資料插入的二叉搜尋樹。其基本操作的期望時間複雜度為 O log n。相對於其他的平衡二叉搜尋樹，Treap 的特點是實現簡單，且能基本實現隨機平衡的結構。屬於弱平衡樹。 介紹 Treap 一詞由 Tree 和 Heap 二詞合成而來。其本身是一棵二叉搜尋樹，它的左子樹和右子樹也分別是一個 Treap，和一般的二叉搜尋樹不同的是，Treap 為每個節點記錄優先順序。Treap 在以關鍵碼構成二叉搜尋樹的同時，其節點優先順序還滿足堆的性質。Treap 維護堆性質的方法用到了旋轉，且只需要進行兩種旋轉操作，因此程式設計複雜度較 Splay 要小一些。 插入 給節點隨機分配一個優先順序，先和二叉搜尋樹的插入一樣，先把要插入的點插入到一個葉子上，然後跟維護堆一樣進行以下操作： 如果當前節點的優先順序比父節點大就進行 2 或 3 的操作 如果當前節點是父節點的左子葉就右旋 如果當前節點是父節點的右子葉就左旋。 由於旋轉是 O 1 的，最多進行 h 次（h 是樹的高度），插入的複雜度是 O h 的，在期望情況下 hO log n，所以它的期望複雜度是 O log n。 刪除 因為 Treap 滿足堆性質，所以只需要把要刪除的節點旋轉到葉節點上，然後直接刪除就可以了。具體的方法就是每次找到優先順序最大的子葉，向與其相反的方向旋轉，直到那個節點被旋轉到了葉節點，然後直接刪除。 刪除最多進行 O h 次旋轉，期望複雜度是 O log n。 查詢 和一般的二叉搜尋樹一樣，但是由於 Treap 的隨機化結構，Treap 中查詢的期望複雜度是 O log n。 演算法分析 二叉搜尋樹有一個特性，就是每個子樹的形態在優先順序唯一確定的情況下都是唯一的，不受其他因素影響，也就是說，左子樹的形態與樹中大於根節點的值無關，右子樹亦然。這是因為 Treap 滿足堆的性質，Treap 的根節點是優先順序最大的那個節點，考慮它的左子樹，樹根也是子樹裡面最大的一點，右子樹亦然。所以 Treap 相當於先把所有節點按照優先順序排序，然後插入，實質上就相當於以隨機順序建立的二叉搜尋樹，只不過它並不需要一次讀入所有資料，可以一個一個地插入。而當這個隨機順序確定的時候，這個樹是唯一的。因此在給定優先順序的情況下，只要是用符合要求的操作，透過任何方式得出的 Treap 都是一樣的，所以不改變優先順序的情況下，特殊的操作不會造成 Treap 結構的退化。而改變優先順序可能會使 Treap 變得不夠隨機以致退化。 Treap 的其它操作的期望複雜度同樣是 O log n。 參考程式 Pascal 版本 Project Amber Standard Sources Library ASSL Author Amber Title Treap Category Data Structure Version v10 Remark XXXXXXXX Tested Problems NA Date 20061116 program ASSL_Treap Input Output const Infinity 65535 type TIndex Longint TKey Longint TPriority Word PTreapNode TTreapNode TTreapNode record Left Right PTreapNode Priority TPriority Key TKey end var NullNode PTreapNode procedure Initalize begin if NullNode nil then begin New NullNode NullNodeLeft NullNode NullNodeRight NullNode NullNodePriority Infinity end end function FindMax T PTreapNode PTreapNode begin if T NullNode then while TRight NullNode do T TRight Result T end function FindMin T PTreapNode PTreapNode begin if T NullNode then while TLeft NullNode do T TLeft Result T end function Find T PTreapNode Key TKey PTreapNode begin while T NullNode do if Key TKey then T TLeft else if Key TKey then T TRight else Break Result T end function LeftRotate T PTreapNode PTreapNode begin Result TLeft TLeft ResultRight ResultRight T end function RightRotate T PTreapNode PTreapNode begin Result TRight TRight ResultLeft ResultLeft T end function InsertNode Key TKey T PTreapNode PTreapNode begin if T NullNode then begin New T TLeft NullNode TRight NullNode TKey Key TPriority Random 65535 end else if Key TKey then begin TLeft InsertNode Key TLeft if TLeftPriority TPriority then T LeftRotate T end else if Key TKey then begin TRight InsertNode Key TRight if TRightPriority TPriority then T RightRotate T end Result T end function DeleteNode Key TKey T PTreapNode PTreapNode begin if T NullNode then if Key TKey then TLeft DeleteNode Key TLeft else if Key TKey then TRight DeleteNode Key TRight else begin if TLeftPriority TRightPriority then T LeftRotate T else T RightRotate T if T NullNode then T DeleteNode Key T else RightRotate begin Dispose TLeft TLeft NullNode end end Result T end procedure Main begin Initalize end begin Main end C 版本 include iostream include ctime include cstdlib define MAX 100 using namespace std typedef struct int lrkeyfix node class treap public node p MAX int sizeroot treap srand time 0 size1 root1 void rot_l int x int yp xr p xrp yl p ylx xy void rot_r int x int yp xl p xlp yr p yrx xy void insert int kint tkey if k1 ksize p klp kr1 p kkeytkey p kfixrand else if tkeyp kfix rot_r k else insert p krtkey if p p kr fixp kfix rot_l k void remove int kint tkey if k1 return if tkeyp kkey remove p krtkey else if p kl1 p kr1 k1 else if p kl1 kp kr else if p kr1 kp kl else if p p kl fix p p kr fix rot_l k remove p kltkey else rot_r k remove p krtkey void print int k if k 1 return if p kl1 print p kl cout p kkey p kfix endl if p kr1 print p kr treap T int main void int i for i 3 i 1 i Tinsert Trooti Tprint Troot for i 3 i 1 i cout endl Tremove Trooti Tprint Troot return 0 與其他結構的比較 AVL 樹 伸展樹（Splay Tree） 線段樹 紅黑樹 Size Balanced Tree 外部連結 一個 Treap 的演示 Randomized Search Trees pdf，有對 Treap 和它的加權形式的詳盡介紹以及複雜度的嚴格證明 nocowcn Treap Category 資料結構 Category 樹結構 Category 二叉樹 Category 搜尋樹