给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
示例 2:
class Solution {
public:
bool dfs(TreeNode* root,long lower,long upper)
{
if(root==NULL) # 如果该结点为NULL,直接返回1
return 1;
int vall = root->val; # 计算该节点对应的值
if(lower!=-LONG_MAX && vall<=lower) # 如果右子节点小于父节点的值,则不是搜索二叉树
return 0;
if(upper!=LONG_MAX && vall>=upper) # 如果左子节点大于父子节点的值,则不是搜索二叉树
return 0;
if(!dfs(root->right,vall,upper)) # 判断该结点的右子节点是否符合要求
return 0;
if(!dfs(root->left,lower,vall)) # 判断该节点的左子节点是否符合要求
return 0;
return 1;
}
bool isValidBST(TreeNode* root) {
return dfs(root,-LONG_MAX,LONG_MAX);
}
};