解答
方案一
java
class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
if (root.left == null && root.right == null) {
return true;
}
if (root.left != null && root.left.val >= root.val) {
return false;
}
if (root.right != null && root.right.val <= root.val) {
return false;
}
return isValidBST(root.left) && isValidBST(root.right);
}
}
方案二
java
class Solution {
public boolean isValidBST(TreeNode root) {
return validate(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean validate(TreeNode node, long min, long max) {
if (node == null) {
return true;
}
if (node.val <= min || node.val >= max) {
return false;
}
return validate(node.left, min, node.val) && validate(node.right, node.val, max);
}
}
要点
二叉搜索树中的任意节点,均满足如下条件:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
粗看上去,方案一似乎可以满足要求,但实际上并不是,方案一没有完整验证1和2两个条件。
另外从代码量的规模看,方案二用较少的代码量,完成了更多的特性,更加优雅。