98.验证二叉搜索树
问题:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
思路:二叉搜索树的中序遍历为升序序列
class Solution {
TreeNode pre = null;
boolean res = true;
public boolean isValidBST(TreeNode root) {
dfs(root);
return res;
}
private void dfs(TreeNode node){
if(node == null) return;
dfs(node.left);
if(pre != null) {
if(pre.val >= node.val){
res = false;
}
}
pre = node;
dfs(node.right);
}
}
- 利用性质,若为二叉搜索树,则当前节点的左子树都小于当前节点,左子树节点的上界为当前节点的值,同理右子树的所有节点的值必须大于当前节点,即下界为当前节点。
class Solution {
public boolean isValidBST(TreeNode root) {
return check(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean check(TreeNode node, long lower, long upper ){
if(node == null) return true;
if(node.val <= lower || node.val >= upper){
return false;
}
//检查左子树,将当前节点的值作为上界,若当前节点属于二叉树中某个节点p的右子树,则此时的下界为p,val
//检查右子树,将当前节点的值作为下界,
return check(node.left, lower, node.val) && check(node.right, node.val, upper);
}
}
整理思路,记录博客,以便复习。若有误,望指正~