验证二叉搜索树
给你一个二叉树的根节点
root
,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
// 递归,给递归增加约束的参数,限制root要小于右子树且大于左子树
func isValidBST(root *TreeNode) bool {
var help func(root, min, max *TreeNode) bool
help = func(root, min, max *TreeNode) bool {
if root == nil {
return true
}
if min != nil && root.Val.(int) <= min.Val.(int) {
return false
}
if max != nil && root.Val.(int) >= max.Val.(int) {
return false
}
return help(root.Left, min, root) && help(root.Right, root, max)
}
return help(root, nil, nil)
}
// 递归的中序遍历为升序
func isValidBST(root *TreeNode) bool {
var tmp int = -int(math.NaN())
var flag bool = true
var inorderTraverse func(root *TreeNode)
inorderTraverse = func(root *TreeNode) {
if root == nil {
return
}
inorderTraverse(root.Left)
if root.Val <= tmp {
flag = false
return
}
tmp = root.Val
inorderTraverse(root.Right)
}
inorderTraverse(root)
return flag
}