跳转至

二叉树遍历:笛卡尔树

Codex(GPT-6)将先序排名转化为本题的笛卡尔树优先级,并应用已有的单调栈建树方法。程序:alternative-cartesian.cpp。区间划分方案见主解。

转换为笛卡尔树

令 \(\operatorname{rank}(u)\) 为编号 \(u\) 在先序中的位置。按照中序排列结点,取先序排名为优先级。原二叉树满足:中序次序固定,且每个父结点的排名小于孩子的排名,因为先序总在子树前访问根。

因此它正是这个优先级序列的最小笛卡尔树。优先级互异,区间最小值唯一确定根,递归确定左右子树,所以满足这两项性质的树唯一。

单调栈构造

从左到右扫描中序位置。栈保存已建部分的右侧链,排名从栈底到栈顶严格递增。处理新结点时,弹出所有排名比它大的栈顶,记录最后弹出的结点作为新结点的左孩子;如果栈还非空,把新结点设为栈顶的右孩子,最后压入新结点。

弹出的右侧链整体位于新位置的左边,又都有更大优先级,所以成为新结点的左子树。未弹出的栈顶优先级更小,可作为其父结点。每步保持中序次序和最小堆性质,因此最终得到唯一的目标树。

后序与复杂度

使用显式栈按根、右、左顺序访问结点,把记录逆序即得左、右、根的后序。不要把通常的根、左、右访问直接逆序,否则左右次序会颠倒。

每个结点在建树单调栈中入栈、出栈各至多一次,遍历也访问一次,总时间 \(O(n)\) ,空间 \(O(n)\) .需要排名表、中序数组、孩子数组和遍历记录。它的价值是不同的建模及显式树结构,不宣称比区间划分更快或内存更少。实际测量见主解。