image.png

解题思路

递归

image.png
上述思路可以用递归法实现。首先将结点的值与上界和下界(如果有)比较。然后,对左子树和右子树递归进行该过程。

  1. public boolean isValidBST(TreeNode root){
  2. return helper(root,null,null);
  3. }
  4. public boolean helper(TreeNode node,Integer lower,Integer upper){
  5. if(node==null) return true;
  6. int val = node.val;
  7. //判断上下界
  8. if(lower!=null&&val<=lower) return false;
  9. if(upper!=null&&val>=upper) return false;
  10. //递归将值带入判断上下界
  11. if(!helper(node.left,lower,val)) return false;
  12. if(!helper(node.right,val,upper)) return false;
  13. return true;
  14. }

中序遍历

我们使用
中序遍历
左子树 -> 结点 -> 右子树的顺序。

上面的结点按照访问的顺序标号,你可以按照 1-2-3-4-5 的顺序来比较不同的策略。

左子树 -> 结点 -> 右子树 意味着对于二叉搜索树而言,每个元素都应该比下一个元素小。

因此,具有 {O}(N) 时间复杂度与 {O}(N) 空间复杂度的算法十分简单:
image.png

  1. public boolean isValidBST(TreeNode root){
  2. Stack<TreeNode> stack = new Stack<>();
  3. double inorder = - Double.MAX_VALUE;
  4. while(!stack.isEmpty()||root!=null){
  5. while(root!=null){
  6. stack.push(root);
  7. root=root.left;
  8. }
  9. root = stack.pop();
  10. if(root.val<=inorder) return false;
  11. inorder = root.val;
  12. root = root.right;
  13. }
  14. return true;
  15. }