携手创作,共同成长!这是我参与「掘金日新计划 · 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方法不是那么容易得出结果的时候,可以尝试通过构造一个二叉搜索树,使用中序遍历知道最值