Skip to content
On this page

验证二叉搜索树

Question

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

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

这是我一开始写的

js
// 节点的左子树只包含小于当前节点的数。
// 节点的右子树只包含大于当前节点的数。
// 所有左子树和右子树自身必须也是二叉搜索树。
var isValidBST = function(root) {
    if(root===null) return true
    if(root.left!=null&&root.left.val>=root.val)  return false
    if(root.right!=null&&root.right.val<=root.val) return false
    let isLeft = isValidBST(root.left)
    console.log(isLeft)
    let isRight = isValidBST(root.right)
    console.log(isRight)
    if(isLeft&&isRight) return true
    else    return false
};

image-20230614085821099image-20230614085847201

这种情况按照我的逻辑也是对的,但不符合题目意思,并不是说左节点小于根节点,右节点大于根节点就行了,还要求左节点大于根节点的根节点

正确做法

将二叉搜索树转换为有序数组

  • 中序遍历求出有序数组
  • 判断数组是否有序
js
var isValidBST = function(root) {
    const arr = []
    digui(root,arr)
    console.log(arr)
    for (let i = 1; i < arr.length; i++) {
        // 注意要小于等于,搜索树里不能有相同元素
        if (arr[i] <= arr[i - 1]) return false;
    }
    return true
};

//中序遍历
var digui = function(root,arr) {
   if(root===null)  return
   digui(root.left,arr)
   arr.push(root.val)
   digui(root.right,arr)
};