二叉树 - 验证二叉搜索树

98. 验证二叉搜索树

在这里插入图片描述
在这里插入图片描述

方法一:辅助数组

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function (root) {
    let arr = [];
    const buildArr = (root) => {
        if (root) {
            buildArr(root.left);
            arr.push(root.val);
            buildArr(root.right);
        }
    }
    buildArr(root);
    for (let i = 1; i < arr.length; ++i) {
        if (arr[i] <= arr[i - 1])
            return false;
    }
    return true;
};

方法二:递归

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
 
var isValidBST = function (root) {
    let pre = null;
    const inOrder = (root) => {
        if (root === null) {
            return true;
        }
        let left = inOrder(root.left);

        if (pre !== null && pre.val >= root.val) {
            return false;
        }
        pre = root;
        let right = inOrder(root.right);
        return left && right;

    }
    return inOrder(root);
};
### 如何验证一个二叉树是否为二叉搜索树 为了验证给定的二叉树是否为二叉搜索树(Binary Search Tree, BST),可以利用二叉搜索树的关键性质:对于任意节点 `node`,其左子树的所有节点值都小于该节点值,右子树的所有节点值都大于该节点值。 以下是两种常见的方法: #### 方法一:基于中序遍历的方法 通过中序遍历二叉树,如果是一棵合法的二叉搜索树,则会得到一个严格递增的数值序列。具体实现如下: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def isValidBST(root: TreeNode) -> bool: stack, prev_val = [], float('-inf') while root or stack: while root: stack.append(root) root = root.left node = stack.pop() # 如果当前节点值不大于前驱节点值,则不是有效BST if node.val <= prev_val: return False prev_val = node.val root = node.right return True ``` 这种方法的核心在于维护一个变量 `prev_val` 来记录上一次访问的节点值,并确保每次新访问的节点值都要比它大[^2]。 #### 方法二:基于上下界范围的方法 另一种方式是从根节点开始递归地检查每个节点是否满足二叉搜索树的定义条件——即它的值应在某个范围内。初始时整个树的根节点应位于负无穷到正无穷之间;随后每进入左子树则更新上限,进入右子树则更新下限。 ```python def helper(node, lower=float('-inf'), upper=float('inf')): if not node: return True val = node.val if val <= lower or val >= upper: return False if not helper(node.right, val, upper): # 右子树需满足更大的最小值 return False if not helper(node.left, lower, val): # 左子树需满足更小的最大值 return False return True def isValidBST(root: TreeNode) -> bool: return helper(root) ``` 此方法的优点是可以提前终止不必要的后续计算,在某些情况下效率更高[^1]。 以上两种方法均能有效地判定一棵二叉树是否符合二叉搜索树的要求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值