“给数组 $A$,构造稳定 tie breaking 的最小Cartesian tree:中序次序等于数组下标,父键不大于子键。任意 $l\le r$, $$ \operatorname{RM…”
形式陈述 ​
定义与唯一性 ​
设互异数组
重复值会破坏“全局最小下标唯一”。若接口要求并列时返回较小下标,可把堆键统一改成
单调栈构造 ​
扫描到前缀末尾时,栈从底到顶恰是当前树的最右根叶路径,且堆键递增。处理新下标
被弹出的节点原本处在最右路径上,且都位于新下标左侧。让整段弹出链挂到新节点左侧,既保留中序下标关系,也恢复父键小于子键的堆序。未被弹出的栈顶比新键小,又是离它最近的未闭合祖先,因此应成为父亲。
对
读到 1 时弹出 3,故下标 1 成为根 2 的左孩子;读到最后的 2 时弹出值 4 对应的下标 3,让它成为新节点 4 的左孩子,而值 1 对应的下标 2 仍做父亲。最终根是下标 2,右孩子是下标 4,后者的左孩子是下标 3。
每个下标只入栈一次、出栈至多一次,所以所有 while 弹栈总计
直觉
笛卡尔树把数组的两种秩序同时固定下来:中序位置保留原下标,堆序祖先记录区间里的较小值。于是一个区间的最小元素恰好是包住两端下标的最深祖先;单调栈则在从左到右扫描时只维护尚未确定右边界的祖先链。
例子与边界
RMQ 与 LCA ​
对区间
若区间中另有更小节点,它会是覆盖
验证与接口边界 ​
构造后的线性验证要同时检查中序遍历为
它不是按数组值搜索的 BST:中序键是固定下标,不能据此寻找某个数值。Treap 的中序是字典键、堆序是随机优先级,二者共享“双序唯一树”的形状定理,应用与概率语义不同。单点改值可能让一个节点跨越很长祖先链,静态线性构造也不自动提供廉价动态更新。
推论与应用
把静态数组线性构造成笛卡尔树后,RMQ 可归约到 LCA,并进一步使用 Euler tour 与简洁 RMQ 结构获得常数查询。相同的“双序”结构也出现在 Treap 中,但后者把字典键作为中序、随机优先级作为堆序,不能直接继承数组区间的语义。
参考资料
- Jean Vuillemin, “A Unifying Look at Data Structures,” 1980.
- Gabow, Bentley, Tarjan, STOC 1984.