| 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))
 
- // }
 
 
  |