题目地址:
验证一棵树是否是二叉搜索树。主要思路是,验证一下每个值是否在它应该在的范围里。它的范围的参数,可以由它的父亲节点得到。所以在递归调用的时候,需要将范围作为参数一层一层传下去。代码如下:
public class Solution {
public boolean isValidBST(TreeNode root) {
return dfs(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean dfs(TreeNode root, long min, long max) {
if (root == null) {
return true;
}
// 如果越出了应该在的范围,就返回false
if (root.val <= min || root.val >= max) {
return false;
}
// 否则采取分而治之的方法将左右孩子的范围向下传递
return dfs(root.left, min, root.val) && dfs(root.right, root.val, max);
}
}
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) {
val = x;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。