Skip to content

力扣链接:98.验证二叉搜索树

难度:⭐⭐

✏️ 方法一:

解题关键词:二叉搜索树中序遍历

解题思路:使用中序遍历,然后判断前一个节点小于后续节点,如果符合条件,那么就是一颗二叉搜索树。

typescript
var isValidBST = function (root) {
  // 栈
  let stack = [];
  // 前一个节点的值
  let preNodeValue = -Infinity;

  while (stack.length || root !== null) {
    // 当前节点不为空,一直找最左边的节点
    while (root !== null) {
      stack.push(root);
      root = root.left;
    }

    // 处理当前节点
    root = stack.pop();
    // 如果中序遍历得到的节点的值小于等于前一个 preNodeValue,说明不是二叉搜索树
    if (root.val <= preNodeValue) {
      return false;
    }

    // 更新前一个节点的值
    preNodeValue = root.val;
    // 处理右边节点
    root = root.right;
  }

  return true;
};

✏️ 方法二:

解题关键词:二叉搜索树递归

解题思路:递归验证每个节点的值是否在指定区间内。

typescript
// 验证一个节点的值是否在 lower 和 upper 之间
const helper = (root, lower, upper) => {
  if (root === null) {
    return true;
  }

  // 如果不满足该区间,就不是一颗二叉搜索树
  if (root.val <= lower || root.val >= upper) {
    return false;
  }

  // 递归验证左右子树
  return helper(root.left, lower, root.val) && helper(root.right, root.val, upper);
}
var isValidBST = function (root) {
  return helper(root, -Infinity, Infinity);
};