98.验证二叉搜索树

71 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

98.验证二叉搜索树

题目分析

题目给定一个二叉树,要求判断是否是一个有效的二叉搜索树,二叉搜索树具有如下特点:

  1. 节点的左子树的节点值都小于当前节点
  2. 节点右子树的节点值都大于当前节点
  3. 所有的左子树和右子树,自身也是二叉搜索树

解题

由于中序遍历下,输出二叉搜索树节点的数值是有序序列。我们可以使用一个辅助数组来判断。首先中序遍历将二叉搜索树变成一个数组,接下来比较速度是否有序,并且没有重复元素(二叉搜索树中不能有重复元素)即可。

代码如下:

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
};

要注意数组判断时为小于等于,因为不能有重复的元素。

这道题也可以不使用辅助数组,在中序遍历的过程中进行判断。

首先来考虑递归的三要素:

  1. 参数和返回值

参数为节点的值,返回值为是否为二叉搜索树。

  1. 终止条件

当传入的节点为空节点时,返回true,因为二叉搜索树也可以为空。

  1. 单层循环的逻辑

单层递归的时候需要判断左子树中的所有值是否小于根结点右子树中所有值是否大于根结点。注意不是仅仅的判断左小于中小于右。因为可能会出现下面的情况:

image.png

总结

这道题的解法有很多,目前只掌握了两种。题目本身并不困难,但是需要明确对二叉搜索树的判断。