🌈【LeetCode.验证二叉搜索树】- JavaScript =>DFS+中序

176 阅读2分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战


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

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

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

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


题意描述

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

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

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

示例 1:

image-20211107223642011

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

解法1:DFS(深度优先搜索)

分析:

深度优先搜索,如果前边的值比后边的大,就false,因为深度优先搜索,先出来的是左值,然后 顶点 然后 右值 但是需要注意的是

  1. v取值的时候,一定要Math.MIN_VALUE。
  2. 边界掉件<= 不能漏掉等于号
var isValidBST = function(root) {
    function helper(node){
        if(!node){return true}
        let leftOk=helper(node.left);
        if(store.length){
            if(store[store.length-1]>=node.val){return false}
        }
        store.push(node.val);
        let rightOk=helper(node.right);
        return leftOk&&rightOk;
        
    }
    let store=[];
    return helper(root)
};

思路2:中序遍历+列表

分析:根据搜索二叉树的性质中序遍历为升序序列,可以先中序遍历搜索二叉树,将结果保存在List中,之后利用冒泡排序的原理(只扫描一次即可)如果发现中序遍历的结果不是升序的,则返回false。

var isValidBST = function(root) {
  if(!root){
    return;
  }
  let isBST = true;
  let prev = null;
  function travse(root){
    if(!root){
      return null;
    }
    root.left && travse(root.left);
    if(prev && prev.val >= root.val){
      isBST = false;
      return;
    }
    prev = root;
    root.right && travse(root.right);
  }
  travse(root);
  return isBST;
};

小分析:其实这个题目还是有几个小陷阱的。

  • 陷阱1:不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。
  • 陷阱2:样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。

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

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