📑 题目:98. 验证二叉搜索树

🚀 本题 LeetCode 传送门

题目大意

给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

解题思路

  • 判断一个树是否是 BST,按照定义递归判断即可

代码

  1. package leetcode
  2. import ""math""
  3. /**
  4. * Definition for a binary tree node.
  5. * type TreeNode struct {
  6. * Val int
  7. * Left *TreeNode
  8. * Right *TreeNode
  9. * }
  10. */
  11. // 解法一,直接按照定义比较大小,比 root 节点小的都在左边,比 root 节点大的都在右边
  12. func isValidBST(root *TreeNode) bool {
  13. return isValidbst(root, math.Inf(-1), math.Inf(1))
  14. }
  15. func isValidbst(root *TreeNode, min, max float64) bool {
  16. if root == nil {
  17. return true
  18. }
  19. v := float64(root.Val)
  20. return v < max && v > min && isValidbst(root.Left, min, v) && isValidbst(root.Right, v, max)
  21. }
  22. // 解法二,把 BST 按照左中右的顺序输出到数组中,如果是 BST,则数组中的数字是从小到大有序的,如果出现逆序就不是 BST
  23. func isValidBST1(root *TreeNode) bool {
  24. arr := []int{}
  25. inOrder(root, &arr)
  26. for i := 1; i < len(arr); i++ {
  27. if arr[i-1] >= arr[i] {
  28. return false
  29. }
  30. }
  31. return true
  32. }
  33. func inOrder(root *TreeNode, arr *[]int) {
  34. if root == nil {
  35. return
  36. }
  37. inOrder(root.Left, arr)
  38. *arr = append(*arr, root.Val)
  39. inOrder(root.Right, arr)
  40. }