📜  Treap(随机二叉搜索树)

📅  最后修改于: 2021-04-17 11:50:31             🧑  作者: Mango

像红黑树和AVL树一样,Treap是平衡二进制搜索树,但不能保证高度为O(Log n)。这个想法是利用随机化和二进制堆属性来保持平衡的可能性很高。搜索,插入和删除的预期时间复杂度为O(Log n)。

捕捞

Treap的每个节点都维护两个值。
1)遵循标准的BST排序(左侧较小,右侧较大)
2)优先级遵循Max-Heap属性的随机分配值。

挖矿的基本操作:
像其他自平衡二叉搜索树一样,Treap在插入和删除期间使用旋转来维护Max-Heap属性。

T1, T2 and T3 are subtrees of the tree rooted with y (on left side) 
or x (on right side)           
                y                               x
               / \     Right Rotation          /  \
              x   T3   – – – – – – – >        T1   y 
             / \       < - - - - - - -            / \
            T1  T2     Left Rotation            T2  T3
Keys in both of the above trees follow the following order 
      keys(T1) < key(x) < keys(T2) < key(y) < keys(T3)
So BST property is not violated anywhere. 

搜索(x)
执行标准的BST搜索以找到x。

插入(x):
1)创建键等于x并且值等于随机值的新节点。
2)执行标准的BST插入。
3)使用旋转来确保插入的节点的优先级遵循max heap属性。

treapInsert

删除(x):
1)如果要删除的节点是叶子,则将其删除。
2)否则用负无穷(-INF)替换节点的优先级,并进行适当的旋转以使节点下降到一片叶子。

treapDelete

有关更多详细信息,请参阅Treap搜索的实现,插入和删除。


参考:

https://zh.wikipedia.org/wiki/陷阱
https://courses.cs.washington.edu/courses/cse326/00wi/handouts/lecture19/sld017.htm