Typescript-Algorithms
    Preparing search index...

    Variable validate_binary_search_treeConst

    validate_binary_search_tree: (root: null | TreeNode) => boolean = isValidBST

    98.验证二叉搜索树

    给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

    有效 二叉搜索树定义如下:

    • 节点的左子树只包含 小于 当前节点的数。
    • 节点的右子树只包含 大于 当前节点的数。
    • 所有左子树和右子树自身必须也是二叉搜索树。

    示例1

    输入: root = [2,1,3]

    输出: true


    示例2 输入: root = [5,1,4,null,null,3,6]

    输出: false 解释: 输入为: [5,1,4,null,null,3,6]。根节点的值 5 大于右子节点 4 的值。


    • 树中节点数目范围在 [1, 10^4]
    • -2^{31} <= Node.val <= 2^{31} - 1

    Type declaration

      • (root: null | TreeNode): boolean
      • Definition for a binary tree node. class TreeNode { val: number left: TreeNode | null right: TreeNode | null constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { this.val = (val===undefined ? 0 : val) this.left = (left===undefined ? null : left) this.right = (right===undefined ? null : right) } }

        Parameters

        • root: null | TreeNode

        Returns boolean

    二叉搜索树的定义

    • 左子树的所有节点值都小于根节点
    • 右子树的所有节点值都大于根节点
    • 每个节点的值严格大于其左子树的所有节点值
    • 每个节点的值严格小于其右子树的所有节点值

    核心思路: 利用二叉搜索树的中序遍历结果是升序的特性来判断是否为有效的二叉搜索树。

    算法步骤

    1. 对二叉树进行中序遍历(左根右)
    2. 在遍历过程中,比较当前节点值与前一节点值
    3. 如果前一个节点值 ≥ 当前节点值,则不是二叉搜索树
    4. 如果遍历完成且所有比较都通过,则是有效的二叉搜索树

    示例

        2
    / \
    1 3

    中序遍历结果:[1, 2, 3] ✓ 升序,是二叉搜索树

        1
    / \
    2 3

    中序遍历结果:[2, 1, 3] ✗ 非升序,不是二叉搜索树

    /**
    * Definition for a binary tree node.
    * class TreeNode {
    * val: number
    * left: TreeNode | null
    * right: TreeNode | null
    * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
    * this.val = (val===undefined ? 0 : val)
    * this.left = (left===undefined ? null : left)
    * this.right = (right===undefined ? null : right)
    * }
    * }
    */

    function isValidBST(root: TreeNode | null): boolean {
    let pre = -Infinity;

    function dfs(node: TreeNode | null): boolean {
    if (!node) {
    return true;
    }

    const l = dfs(node.left);

    if (pre >= node.val) {
    return false;
    }
    pre = node.val;

    const r = dfs(node.right);

    return l && r;
    }

    return dfs(root);
    };