PrepStack · Markdown HTML

BST 有序性 / 中序遍历

树、BST 与 Trie · HTML

数学 / 逻辑形态

严格 BST:左子树所有值 < node.val < 右子树所有值。验证可递归传 (low,high),或中序要求 prev < current;搜索每次按比较排除一整棵子树。重复值策略必须显式定义。

识别信号

容易误判的相似信号

SignalWhy it is different
普通二叉树没有全局排序时不能按值剪枝,中序也不保证有序。
只检查 node 与直接孩子远端后代可能违反祖先界限而仍满足局部父子比较。
树可能含重复值但规则未知严格/左含等/右含等会改变 bounds 与中序比较,必须先确认。

核心不变量

递归到 node 时,(low,high) 是所有祖先约束的交集;合法节点值必须位于其中,中序遍历的已访问前缀严格有序。

状态、转移与处理顺序

ItemDefinition
State当前节点与祖先上下界,或迭代中序栈、prev 和访问秩。
Transition验证时左传 (low,node.val),右传 (node.val,high);秩查询中序 pop 时计数。
Frontier / order搜索沿一条根到叶路径;中序用栈保存尚未访问的祖先与其右子树。

Python 骨架

def is_valid_bst(root):
    stack, node = [], root
    prev = None
    while stack or node:
        while node:
            stack.append(node)
            node = node.left
        node = stack.pop()
        if prev is not None and node.val <= prev:
            return False
        prev = node.val
        node = node.right
    return True

正确性思路

  1. BST 定义蕴含中序先访问全部较小值,再节点,再全部较大值,故合法树中序严格递增。
  2. 若中序严格递增,对任一节点,左子树中序片段全在节点之前且更小,右片段全在之后且更大,递归满足全局 BST 条件。
  3. 模板恰按中序比较每一对相邻值,因此验证等价条件。

复杂度

TimeSpaceParameters
验证/全中序 O(n);平衡 BST 搜索 O(h)=O(log n),最坏 O(n)O(h) 栈n 为节点数,h 为树高。

边界条件

错误模式

PatternWhy it fails / fix
只比较直接孩子无法捕捉右子树中小于远祖先的节点;需祖先 bounds 或全局中序。
用 32 位极值作无限界节点可能等于 sentinel;使用 None 或数学无穷。
prev 用假值判断prev=0 合法,必须检查 prev is not None。
误以为 BST 必平衡搜索复杂度是 O(h),退化时 O(n)。

选择与排除规则

相关模板

RelationTemplateBoundary
alternativeFenwick Tree / 树状数组离线离散值域上的动态秩统计比维护 BST 更适合。

原创微型例子

环节内容
Resultbounds 或中序 [3,9,8] 都能识别无效。
Setup根 8,左子 3;节点 3 的右子为 9。
Trace9>3 满足局部父子比较,但它位于根 8 的左子树,违反上界 8。

Recall prompts

我的补充