树堆gydF4y2Ba
树堆gydF4y2Ba是一种不确定的数据结构,采用笛卡尔树的形式,用于维护平衡的二叉搜索树。与大多数平衡二叉搜索树不同,比如gydF4y2Ba替罪羊树gydF4y2Ba,gydF4y2Ba红黑树gydF4y2Ba,gydF4y2Baavl树gydF4y2Ba,gydF4y2Ba芬威克树gydF4y2Ba等等,treap数据结构没有gydF4y2Ba保证gydF4y2Ba平衡本身,但它以很高的概率确保了这一点。gydF4y2Ba
笛卡尔树与树的结构gydF4y2Ba
树堆是gydF4y2Ba笛卡尔树gydF4y2Ba,这意味着它们是具有有序对的树,并且节点遵循二叉搜索树的属性,其中一个节点和gydF4y2Ba堆gydF4y2Ba相对于另一个的性质。gydF4y2Ba
这意味着堆由gydF4y2Ba 节点,每个节点是一对gydF4y2Ba ,分别称为优先级和键,其中为每个节点gydF4y2Ba
- 而且gydF4y2Ba
给定一组gydF4y2Ba 对,有一个独特的笛卡尔树由他们组成。gydF4y2Ba
如果对的列表是空的,那么我们构造一个空树,我们就完成了。gydF4y2Ba
否则,我们选择根节点作为优先级最高的对,并递归地用所有键值小于(或等于)根节点的对构建左子树,用所有键值大于根节点的对构建右子树。gydF4y2Ba
树是一种笛卡尔树,可以选择优先级gydF4y2Ba随机gydF4y2Ba一个大范围的整数。gydF4y2Ba
我们在这里不证明这一点,但直观上很明显,树堆的预期高度是gydF4y2Ba
因此,treap的每个节点都由一个值、一个优先级和指向它的两个子节点(可能为空)的指针组成。gydF4y2Ba
插入gydF4y2Ba
我们将通过逐个插入元素来构建树。让我们来看看第一个策略。gydF4y2Ba
只使用二叉搜索树属性盲目插入。使用一个随机值作为优先级,gydF4y2Ba旋转gydF4y2Ba将节点移到适当的位置。gydF4y2Ba
我们不定义gydF4y2Ba旋转gydF4y2Ba这里是正式的,但用图表来说明:gydF4y2Ba
注意,BST不变量在此操作下保持不变。gydF4y2Ba