98.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package main
  2. /**
  3. * Definition for a binary tree node.
  4. * type TreeNode struct {
  5. * Val int
  6. * Left *TreeNode
  7. * Right *TreeNode
  8. * }
  9. */
  10. func isValidBST(root *TreeNode) bool {
  11. isValid, _, _ := isValidBSTRoot(root)
  12. return isValid
  13. }
  14. func isValidBSTRoot(root *TreeNode) (isValid bool, min int, max int) {
  15. if root == nil {
  16. isValid = true
  17. return // Do NOT rely on math.MaxInt32 or so
  18. }
  19. isValidL, minL, maxL := isValidBSTRoot(root.Left)
  20. if root.Left == nil {
  21. min = root.Val
  22. } else {
  23. if !isValidL || root.Val <= maxL {
  24. return
  25. }
  26. min = minL
  27. }
  28. isValidR, minR, maxR := isValidBSTRoot(root.Right)
  29. if root.Right == nil {
  30. max = root.Val
  31. } else {
  32. if !isValidR || root.Val >= minR {
  33. return
  34. }
  35. max = maxR
  36. }
  37. isValid = true
  38. return
  39. }
  40. // func main() {
  41. // // 1
  42. // // / \
  43. // // nil 2
  44. // // / \
  45. // // 3 nil
  46. // n3 := TreeNode{3, nil, nil}
  47. // n2 := TreeNode{2, &n3, nil}
  48. // n1 := TreeNode{1, nil, &n2}
  49. // fmt.Println(isValidBST(&n1))
  50. // // nil
  51. // fmt.Println(isValidBST(nil))
  52. // // 2147483647
  53. // fmt.Println(isValidBST(&TreeNode{math.MaxInt32, nil, nil}))
  54. // // 1
  55. // // / \
  56. // // nil 1
  57. // n6 := TreeNode{1, nil, nil}
  58. // n5 := TreeNode{1, nil, &n6}
  59. // fmt.Println(isValidBST(&n5))
  60. // }