题目大意
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
解题思路
假设当前根节点root,要想让root是搜索二叉树,必须root的左子树和右子树是搜索二叉树,且root要大于左子树最大值(如果存在),root要小于右子树的最小值(如果存在)。
反过来说,必须满足root左子树中所有点均小于root,右子树中所有点均大于root。
假设root的值可以任意取,在判断root左子树时,root左子树的上界是root->val,左子树中任何值必须小于该值。在判断root右子树时,root右子树的下界是root->val,右子树中任何值必须大于该值。
class Solution {
public:
bool isValidBST(TreeNode* root) {
// 表示当前子树中取值的上下界是MIN和MAX;
return judge(root, LONG_MIN, LONG_MAX);
}
bool judge(TreeNode * root, long leftMax, long rightMin){
if (!root){
return true;
}
// 如果当前节点的值在上下界范围外,则不是搜索二叉树
if (root->val <= leftMax || root->val >= rightMin){
return false;
}
// 判断左子树和右子树
// 判断左右子树的时候,上下界发生变动
// 左子树上界是root,右子树下界是root
return judge(root->left, leftMax, root->val) && judge(root->right, root->val, rightMin);
}
};