题目大意

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

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

解题思路

方式一:中序遍历 升序

利用中序遍历 后,判断是否是升序即可,但凡有一个不是升序的直接就返回false

  1. class Solution {
  2. TreeNode max;
  3. public boolean isValidBST(TreeNode root) {
  4. if (root == null) {
  5. return true;
  6. }
  7. //left
  8. boolean left = isValidBST(root.left);
  9. if (!left) {
  10. return false;
  11. }
  12. if (max != null && root.val <= max.val) {
  13. return false;
  14. }
  15. max = root;
  16. //left
  17. boolean right = isValidBST(root.right);
  18. return right;
  19. }

方式二:分治思想

  1. class Solution {
  2. public boolean isValidBST(TreeNode root) {
  3. if (root == null) {
  4. return true;
  5. }
  6. return helper(root, null, null);
  7. }
  8. /**
  9. * 对于一个节点来说 先给他一个范围[min,max]
  10. * 判断当前节点v是否在这个范围里面,如果不在直接就return false ,否则继续递归
  11. * 递归操作时 左子树从 [min,v-1] ,对于右子树从[v+1,max]
  12. */
  13. private boolean helper(TreeNode root, Integer min, Integer max) {
  14. if (root == null) {
  15. return true;
  16. }
  17. if ((max != null && root.val >= max) || (min != null && root.val <= min)) {
  18. return false;
  19. }
  20. //区间范围 [min,val]
  21. boolean left = helper(root.left, min, root.val);
  22. //[val,max]
  23. boolean right = helper(root.right, root.val, max);
  24. return left && right;x
  25. }
  26. }