leetcode刷题笔记九十八题 验证二叉搜索树
源地址:98. 验证二叉搜索树
问题描述:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:输入:
2
/
1 3
输出: true
示例 2:输入:
5
/
1 4
/
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。
/**
本题有两种解法,一种是递归, 一种是中序遍历
递归过程需要注意,由于二叉搜索树的性质是root大于左子树小于右子树,直接比较当前结点的左右子树并不合理,需要设置一个lower和upper上下界并更新
*/
/**
* Definition for a binary tree node.
* class TreeNode(var _value: Int) {
* var value: Int = _value
* var left: TreeNode = null
* var right: TreeNode = null
* }
*/
object Solution {
def isValidBST(root: TreeNode): Boolean = {
def helper(root: TreeNode, upper: Long, lower: Long): Boolean = {
if (root == null) return true
val cur = root.value
if (lower != Long.MinValue && cur <= lower) return false
if (upper != Long.MinValue && cur >= upper) return false
if (helper(root.left, cur, lower) == false) return false
if (helper(root.right, upper, cur) == false) return false
return true
}
return helper(root, Long.MaxValue, Long.MinValue)
}
}
/**
中序遍历的情况下,由于二叉搜索树的性质,获取的结点依序严格递增,这样我们可以设置一个lower与root.value比较,如果大于等于就返回false,否则更新lower,比较下一个结点
*/
/**
* Definition for a binary tree node.
* class TreeNode(var _value: Int) {
* var value: Int = _value
* var left: TreeNode = null
* var right: TreeNode = null
* }
*/
object Solution {
def isValidBST(root: TreeNode): Boolean = {
var lower = Long.MinValue
def helper(root: TreeNode): Boolean = {
if (root != null){
if (root.left != null && helper(root.left) == false) return false
if(root.value <= lower) return false
lower = root.value
if(root.right != null && helper(root.right) == false) return false
}
return true
}
return helper(root)
}
}