注意,题目中给的定义是严格小于,严格大于,不包含等于。
这样,每个位置的值实际上必须在一个区间内。可以用递归的先序遍历的方法,先判断根是否在对应区间内,再判断左子树与右子树。
举一个例子:
对于根节点,任意取;向左,需要严格小于1,故区间变为[负无穷,1),向右,需要大于1,故区间变为(1,正无穷];走到4时,区间为(1,3),4不在这个区间内,即不是二叉查找树
例子中的正无穷与负无穷只是用作分析,由于结构体中已定义了值为int类型,这里的负无穷与正无穷即int的最小值和最大值。
只要区间允许,是可以取到int的最大和最小的,故为了包含边界,初始是用long的最大与最小来初始。
依照先序遍历的递归写法,写出代码如下:
bool isValidBST(TreeNode *root) {
// write your code here
return isValidBST(root,LONG_MIN,LONG_MAX);
}
//用long是为了包含int的边界
bool isValidBST(TreeNode* T,long low,long high){
if(!T) return true;
if(T->val>=high || T->val<=low) return false;
return isValidBST(T->left,low,T->val) && isValidBST(T->right,T->val,high);
}