题目要求:给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
思路如下:
1、考虑递归
2、需要注意的是,该节点左子树的所有值一定小于该节点的值,该节点右子树的所有值一定都大于该节点的值,因此需要一个带有上下界的辅助函数,判断当前值是否在要求的上下界之内,即左子树有上界,上界的值为该节点值,而右子树有下界,下界的值为该节点的值。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return helper(root,null,null);
}
public boolean helper(TreeNode root,Integer lower,Integer upper){
//初始判断
if(root==null){
return true;
}
//当左子结点的值大于等于该节点值,不符合条件
if(lower!=null&&lower>=root.val){
return false;
}
//当右子结点的值大于等于该节点值,同样不符合条件
if(upper!=null&&upper<=root.val){
return false;
}
//左右子节点均符合条件时,进行左右子树递归,并建立相应界,左子树有上界,右子树有下界
if(!helper(root.left,lower,root.val)){
return false;
}
if(!helper(root.right,root.val,upper)){
return false;
}
//以上均符合二叉搜索树条件时,返回true
return true;
}
}
原题地址:
98. 验证二叉搜索树