BM34 判断是不是二叉搜索树

题目描述

image

思路分析

第一种方法:二叉搜索树的中序遍历一定是递增的,只需判断中序遍历的数组即可

第二种方法:
- 如果当前节点的值小于左区间或者大于右区间,则返回 false。
- 否则,继续分别递归左右儿子节点:
- 递归左儿子,并将左儿子的右区间修改为父节点的值;
- 递归右儿子,并将右儿子的左区间修改为父节点的值。
- 最后,如果没有返回false,说明满足二叉搜索树,返回true。

代码参考

/*
  二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。
  这道题我们考虑使用递归来做
  思考:
      1. 每个节点需要做什么
      2. 之后如何递归
      3. 递归退出条件
    每个节点如果传递进来,都需要判断它们的大小关系,也就是 root.left.val < root.val < root.right.val
    如果符合条件那么继续将左子树和右子树传递
    如果左子树和右子树为空,则返回true
  第二种思路:
    中序遍历的结果一定是从小到大排列的,我们只需要得到中序遍历的结果
    之后再判断是否从小到大排列的,返回结果即可
*/
const isValidBST = function (root) {
  // if (!root) return true
  // if (root.left.val <= root.val <= root.right.val) {
  //   return isValidBST(root.left) && isValidBST(root.right)
  // } else {
  //   return false
  // }
  const result = []
  const dfs = (root) => {
    if (!root) return
    dfs(root.left)
    result.push(root.val)
    dfs(root.right)
  }
  dfs(root)
  for (let i = 0; i < result.length - 1; i++) {
    if (result[i] <= result[i + 1]) continue
    else return false
  }
  return true
}
// 方法二:
const isValidBST2 = function (root) {
  const fun = (root, left, right) => {
    if (root == null) return true
    if (root.val <= left || root.val >= right) return false
    return fun(root.left, left, root.val) && fun(root.right, root.val, right)
  }
  return fun(root, -Infinity, Infinity)
}

posted @ 2023-01-03 13:55  含若飞  阅读(10)  评论(0编辑  收藏  举报