package BinaryTree
import "math"
type isBSTRet struct {
isBST bool
maxVal, minVal int
}
func isValidBST(root *TreeNode) bool {
return isBSTFunc(root).isBST
}
func isBSTFunc(root *TreeNode) isBSTRet {
if root == nil {
return isBSTRet{
isBST: true,
maxVal: math.MinInt,
minVal: math.MaxInt,
}
}
leftRet := isBSTFunc(root.Left)
rightRet := isBSTFunc(root.Right)
return isBSTRet{
isBST: leftRet.isBST && rightRet.isBST && root.Val > leftRet.maxVal && root.Val < rightRet.minVal,
maxVal: max(leftRet.maxVal, rightRet.maxVal, root.Val),
minVal: min(leftRet.minVal, rightRet.minVal, root.Val),
}
}