一起刷LeetCode——验证二叉搜索树(二叉树/递归)

76 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

验证二叉搜索树

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

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

来源:力扣(LeetCode) 链接:leetcode.cn/problems/va…

分析

常规方法

  • 给出一棵二叉树,判断是否是二叉搜索树,关于二叉搜索树需要知道的是二叉搜索树的中序遍历是升序的,所以只需要中序遍历给出的二叉树,就可以判断是不是一棵二叉搜索树。再细化一下,在遍历的时候,上一次遍历的值如果大于等于当前节点的值,就可以认为不是一棵二叉搜索树,可以提前结束遍历。

代码

var isValidBST = funciton(root){
    let preVal
    let valid = true
    const inOrder = node => {
        if(!node || !valid){
            return
        }
        inorder(node.left)
        if(preVal >= node.val){
            valid = false
            return
        }
        preVal = node.val
        inOrder(node.right)
    }
    inOrder(root)
    return valid
}

另一种解法

  • 如果不知道二叉搜索树中序遍历得到的结果是升序这个特性,只能根据题目得知左子树小于根节点小于右子树这个特性,可以根据树的特性使用递归来判断是否是二叉搜索树

代码

var isValidBST = function(node,min=null,max=null) {
    if(max!==null && node.val >= max) {
        return false
    }
    if(min!==null && node.val<=min){
        return false
    }
    if(node.left && !isValideBST(node.left,min,node.val){
        return false
    }
    if(node.right && !isValideBST(node.right,node.val,max){
        return false
    }
    return true
}

总结

  • 关于二叉树,以及各类其他二叉树,在使用前最好是了解一些他们特有的特性,解题的时候会比较速度。当然如果不知道的话,熟练运用树的特性,使用递归的方法也能解决
  • 对于二叉搜索树,如果题目中有求最值问题,用JavaScript的sort方法不是那么容易得出结果的时候,可以尝试通过构造一个二叉搜索树,使用中序遍历知道最值