treap是擁有鍵值和優先順序兩種權值的樹
對於鍵值而言它是排序二叉樹
對於優先順序而言它是堆
struct node
};
旋轉操作
d=0 代表左旋,d=1 代表右旋
技巧性較強,d^1等價於1-d(因為d就是0或1)
o是指向乙個treap節點的指標,本身可以修改所以是引用
void rotate(node* &o, int d)
插入操作
插入節點時,首先隨機給新節點乙個優先順序,然後執行普通的插入演算法
執行完畢後用左右旋讓這個節點往上走,從而維持堆性質
//在以o為根的子樹中插入鍵值x,修改o
void insert(node* &o, int x)
else
}
刪除操作
刪除時,首先找到待刪除節點。
如果它只有一棵子樹,情況就簡單了。
直接用這棵子樹代替待刪除節點成為根即可(o為葉子也符合這個情況)
有兩棵子樹時,先把優先順序高的旋轉到根,然後遞迴在另一顆子樹中刪除節點o
void remove(node* &o, int x)
}else
remove(o->ch[d], x);
}
查詢操作
刪除和插入前都需要查詢,防止「待插入的值已經存在」和「待刪除的值不存在」
int find(node* &o, int x)
return
0; //不存在
}
平衡樹模板 Treap
演算法標籤 treap 種下第一棵平衡樹 這是一道模板題。如果覺得這個題水的可以做一下4544壓行,是千古神犇花爸爸出的神犇題。您需要寫一種資料結構 可參考題目標題,但是這句話其實並沒有什麼用233 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3....
Treap總結與模板
支援插入,刪除,區間第k大,乙個數的前驅,後繼.核心的思想 每個節點有乙個key表示該節點的值 和乙個priority 表示當前節點的優先值 我們的樹既滿足二叉查詢樹的左小右大 右滿足堆的上小下大 這樣一來,均攤複雜度可以達到logn 在插入時,只要不滿足堆的性質就旋轉 在刪除時,我們找到要刪除的點...
模板 普通平衡樹 Treap
題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的...