🌈【LeetCode 98. 验证二叉搜索树 】- JavaScript(中序遍历+递归)

114 阅读3分钟

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


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【LeetCode 98. 验证二叉搜索树 】- JavaScript(中序遍历+递归)

题目描述

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

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

  • 节点的左子树只包含 小于 当前节点的数。

  • 节点的右子树只包含 大于 当前节点的数。

  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

image-20220629091945643

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

递归中序遍历

思路分析:

整体的的思路:分析题目知道这题目可以使用递归式的中序遍历来做,该方法有一个前提:树不为空,为空需要多设计一个方法,大致思路:

  • 首先找出根节点左子树的最右子节点,判断根节点值是否大于该值
  • 然后找出根节点右子树的最左子节点,判断根节点值是否小于该值
  • 满足上述条件的情况下,采用递归的方法判断左子树和右子树是否满足二叉搜索树的要求。

为了验证二叉搜索树,我们知道任一节点的值必须大于其左子树的所有节点的值,且小于其右子树所有节点的值。这是二叉搜索树的定义,因此我们需要两个列表分别用来存放该节点的节点的值,必须大于该节点的节点的值。具体实现注意点:

  • 如果树为空,return false,设置一个最小值,初始化为负无穷,设置一个最大值,初始化为正无穷,每次都判断节点的值在这个区间内。
  • 第一次先判断root,root肯定是符合要求的。继续检查root的左、右。检查root的左子树时,值不应该超过上界(上界就是父节点的值)。
  • 同理,右子树的值不应该小于下界。
var isValidBST = function(root) {
  let isValid = true;

  const numList = [];

  function recur(node) {
    if (!node) {
      return;
    }
    checkValid() && recur(node.left);
    numList.push(node.val);
    checkValid() && recur(node.right);
  }
  recur(root);

  function checkValid() {
    if (numList.length < 2) {
      return true;
    }

    const currValid = numList[0] < numList[1];

    if (!currValid) {
      isValid = false;
    }

    numList.shift();
    return isValid && currValid;
  }

  return isValid;
};

思考

题目其实不是很难,但是我WA了好多次,卡边界值太恶心了。呜呜呜...


感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤