class Node:
Node *left
Node *right
key
pri
class Treap:
Node *root
# 递归搜索插入位置
insert(Node *t, key, pri):
# 到达叶子节点时,生成并返回节点
if t = NULL:
return Node(key, pri) # 返回指针
# 忽略重复的键
if key = t.key:
return t
if key < t.key: # 移动到左子节点
# 返回的节点成为左子节点
t.left ← insert(t.left, key, pri)
# 如果该节点的优先级高,通过右旋转提升该节点
if t.pri < t.left.pri:
t ← rightRotate(t)
else: # 移动到右子节点
# 返回的节点成为右子节点
t.right ← insert(t.right, key, pri)
# 如果该节点的优先级高,通过左旋转提升该节点
if t.pri < t.right.pri:
t ← leftRotate(t)
return t
# 递归搜索对象
erase(Node *t, key):
if t = NULL:
return NULL
if key = t.key # t 是删除对象
if t.left = NULL and t.right = NULL: # t 是叶子节点
return NULL
else if t.left = NULL: # t 只有一个右子节点
t ← leftRotate(t)
else if t.right = NULL: # t 只有一个左子节点
t ← rightRotate(t)
else: # t 有两个子节点
# 提升优先级高的子节点
if t.left.pri > t.right.pri
t ← rightRotate(t)
else:
t ← leftRotate(t)
return erase(t, key)
# 递归搜索对象
if key < t.key:
t.left ← erase(t.left, key)
else:
t.right ← erase(t.right, key)
return t