树堆gydF4y2Ba
树堆gydF4y2Ba是一种笛卡尔树形式的非确定性数据结构,用于维护平衡二叉搜索树。与大多数平衡二叉搜索树不同,比如gydF4y2Ba替罪羊树gydF4y2Ba,gydF4y2Ba红黑树gydF4y2Ba,gydF4y2Baavl树gydF4y2Ba,gydF4y2Ba芬威克树gydF4y2Ba等等,处理数据结构没有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