验证搜索二叉树
题目链接:98. 验证二叉搜索树
题目:
思路:
整体思路就是按照题目要求进行程序的编写,主要使用到了递归的算法。
在递归的过程中,一共有三个参数,其意义分别是:当前的节点的位置,此时的最大的值,此时的最小的值。
在每次进行递归的时候都有两种选择(因为是二叉树)
- 向左子树进行递归
- 向右子树进行递归
在进行递归的时候,如果当前的节点的左右子树均满足题目要求(节点的左子树只包含小于当前节点的数,节点的右子树只包含大于当前节点的数。),那么就继续向下进行递归,对左子树进行递归的时候需要将参数lower
更改为当前节点,因为左子树的值只会比当前节点的值更小。对右子树进行递归的时候需要将参数upper
更改为当前节点的值,因为右子树的值只会比当前节点的值更大。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
const long long inf = 0x3f3f3f3f;
bool judge(TreeNode*& root, long long upper, long long lower){
if(root == nullptr){
return true;
}
// 判断如果不符合规则就返回false
if(root->val <= lower || root->val >= upper){
return false;
}
// 其他情况进行递归求解(左子树,右子树)
return judge(root->left, root->val, lower) && judge(root->right, upper, root->val);
}
bool isValidBST(TreeNode* root) {
return judge(root, LONG_MAX, LONG_MIN);
}
};