123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package main
- /**
- * Definition for a binary tree node.
- * type TreeNode struct {
- * Val int
- * Left *TreeNode
- * Right *TreeNode
- * }
- */
- func isValidBST(root *TreeNode) bool {
- isValid, _, _ := isValidBSTRoot(root)
- return isValid
- }
- func isValidBSTRoot(root *TreeNode) (isValid bool, min int, max int) {
- if root == nil {
- isValid = true
- return // Do NOT rely on math.MaxInt32 or so
- }
- isValidL, minL, maxL := isValidBSTRoot(root.Left)
- if root.Left == nil {
- min = root.Val
- } else {
- if !isValidL || root.Val <= maxL {
- return
- }
- min = minL
- }
- isValidR, minR, maxR := isValidBSTRoot(root.Right)
- if root.Right == nil {
- max = root.Val
- } else {
- if !isValidR || root.Val >= minR {
- return
- }
- max = maxR
- }
- isValid = true
- return
- }
- // func main() {
- // // 1
- // // / \
- // // nil 2
- // // / \
- // // 3 nil
- // n3 := TreeNode{3, nil, nil}
- // n2 := TreeNode{2, &n3, nil}
- // n1 := TreeNode{1, nil, &n2}
- // fmt.Println(isValidBST(&n1))
- // // nil
- // fmt.Println(isValidBST(nil))
- // // 2147483647
- // fmt.Println(isValidBST(&TreeNode{math.MaxInt32, nil, nil}))
- // // 1
- // // / \
- // // nil 1
- // n6 := TreeNode{1, nil, nil}
- // n5 := TreeNode{1, nil, &n6}
- // fmt.Println(isValidBST(&n5))
- // }
|