version1
思路:验证二叉搜索树等价于中序遍历有序,可以用递归中序遍历(代码简洁),也可以用迭代中序遍历(效率高)。
version2
思路:递归中序遍历,自顶向下设计,每一颗树均不超过指定的范围:[min, max]
public class Solution98 {public boolean isValidBST(TreeNode root) {return validate(root, Long.MIN_VALUE, Long.MAX_VALUE);}public boolean validate(TreeNode root, long min, long max){if (root == null) {return true;}if(root.val <= min || root.val >= max){return false;}return validate(root.left, min, root.val) && validate(root.right, root.val, max);}}
version3(不推荐)
思路:递归中序遍历,自底向上设计,每次访问子树均返回这棵子树上的最大值、最小值以及子树是否是合法的结果。
public class Solution98 {public boolean isValidBST(TreeNode root) {return findMaxAndMin(root).get("isValid") == 1;}public Map<String, Integer> findMaxAndMin(TreeNode root){Map<String, Integer> ret = new HashMap<>();Map<String, Integer> leftRet;Map<String, Integer> rightRet;if (root.left == null) {leftRet = new HashMap<>();leftRet.put("max", Integer.MIN_VALUE);leftRet.put("min", root.val);leftRet.put("isValid", 1);}else{leftRet = findMaxAndMin(root.left);}if(root.right == null){rightRet = new HashMap<>();rightRet.put("max", root.val);rightRet.put("min", Integer.MAX_VALUE);rightRet.put("isValid", 1);}else {rightRet = findMaxAndMin(root.right);}boolean isValid = true;if(root.left == null && root.val == Integer.MIN_VALUE){}else {isValid = leftRet.get("isValid") ==1 && leftRet.get("max") < root.val;}if(root.right == null && root.val == Integer.MAX_VALUE){}else {isValid = isValid && rightRet.get("isValid") == 1 && rightRet.get("min") > root.val;}if(isValid){ret.put("max", rightRet.get("max"));ret.put("min", leftRet.get("min"));ret.put("isValid", 1);}else{ret.put("isValid", 0);}return ret;}}
