LeetCode题解:98. 验证二叉搜索树,递归,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/validate-binary-search-tree/

解题思路:

  1. 递归遍历所有节点,每次都对比当前节点与上一个节点的大小。
  2. 向左遍历则对比右侧节点的大小,及其值是否大于父节点。
  3. 向右遍历则对比左侧节点的大小,及其值是否小于父节点。
  4. 由于每次对比的都是相邻节点,若都满足规律,则自然保证了二叉搜索树的定义。
// 递归遍历二叉树,同时校验是否合法
function traversal(
  node, // 当前节点
  leftLimit, // 当前节点左侧节点的值
  rightLimit, // 当前节点右侧节点的值
) {
  // 递归终止条件
  // 如果当前节点为空,则默认返回true
  if (!node) {
    return true;
  }

  // 当前递归逻辑
  // 由于二叉搜索树的节点从左到右递增排列,因此如果节点的值不符合此规律则为false
  // 每次比较的都是当前节点相邻节点的值,因此比较之后就成功之后二叉树就自然符合了如下规则:
  // 左子树上所有节点的值均小于它的根节点的值;右子树上所有节点的值均大于它的根节点的值
  if (leftLimit >= node.val || node.val >= rightLimit) {
    return false;
  }

  // 继续向下递归
  // 返回子节点的判断结果,左右子节点都满足条件时,才为true
  return (
    // 向左递归,此时leftLimit始终为-Infinity,rightLimit为子节点右侧节点的值
    traversal(node.left, leftLimit, node.val) &&
    // 向右递归,此时rightLimit始终为Infinity,leftLimit为子节点左侧节点的值
    traversal(node.right, node.val, rightLimit)
  );
}
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function (root) {
  return traversal(root, -Infinity, Infinity);
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值