version1

思路:验证二叉搜索树等价于中序遍历有序,可以用递归中序遍历(代码简洁),也可以用迭代中序遍历(效率高)。

version2

思路:递归中序遍历,自顶向下设计,每一颗树均不超过指定的范围:[min, max]

  1. public class Solution98 {
  2. public boolean isValidBST(TreeNode root) {
  3. return validate(root, Long.MIN_VALUE, Long.MAX_VALUE);
  4. }
  5. public boolean validate(TreeNode root, long min, long max){
  6. if (root == null) {
  7. return true;
  8. }
  9. if(root.val <= min || root.val >= max){
  10. return false;
  11. }
  12. return validate(root.left, min, root.val) && validate(root.right, root.val, max);
  13. }
  14. }

version3(不推荐)

思路:递归中序遍历,自底向上设计,每次访问子树均返回这棵子树上的最大值、最小值以及子树是否是合法的结果。

  1. public class Solution98 {
  2. public boolean isValidBST(TreeNode root) {
  3. return findMaxAndMin(root).get("isValid") == 1;
  4. }
  5. public Map<String, Integer> findMaxAndMin(TreeNode root){
  6. Map<String, Integer> ret = new HashMap<>();
  7. Map<String, Integer> leftRet;
  8. Map<String, Integer> rightRet;
  9. if (root.left == null) {
  10. leftRet = new HashMap<>();
  11. leftRet.put("max", Integer.MIN_VALUE);
  12. leftRet.put("min", root.val);
  13. leftRet.put("isValid", 1);
  14. }else{
  15. leftRet = findMaxAndMin(root.left);
  16. }
  17. if(root.right == null){
  18. rightRet = new HashMap<>();
  19. rightRet.put("max", root.val);
  20. rightRet.put("min", Integer.MAX_VALUE);
  21. rightRet.put("isValid", 1);
  22. }else {
  23. rightRet = findMaxAndMin(root.right);
  24. }
  25. boolean isValid = true;
  26. if(root.left == null && root.val == Integer.MIN_VALUE){
  27. }else {
  28. isValid = leftRet.get("isValid") ==1 && leftRet.get("max") < root.val;
  29. }
  30. if(root.right == null && root.val == Integer.MAX_VALUE){
  31. }else {
  32. isValid = isValid && rightRet.get("isValid") == 1 && rightRet.get("min") > root.val;
  33. }
  34. if(isValid){
  35. ret.put("max", rightRet.get("max"));
  36. ret.put("min", leftRet.get("min"));
  37. ret.put("isValid", 1);
  38. }else{
  39. ret.put("isValid", 0);
  40. }
  41. return ret;
  42. }
  43. }