仅个人学习留存,侵私删!
题目
思考过程
- 左子小于当前节点,右子大于当前节点即可,简单易写,但二叉搜索树需满足左子树均小于当前节点,右子树均大于当前节点。即整个二叉树中序遍历严格递增。
class Solution {
public:
bool judgenow(TreeNode* root)
{
if(root == NULL)
return 1;
if(root->left == NULL || root->right == NULL)
return 1;
if(root->left->val < root->val && root->right->val > root->val)
return 1;
else
return 0;
}
bool isValidBST(TreeNode* root)
{
bool res = 1;
if(root == NULL)
return res;
res *= judgenow(root);
res *= judgenow(root->right);
res *= judgenow(root->left);
return res;
}
};
- 左子1的右子2上限为左子1的父节点0 ,下限为左子1;
右子1的左子2上限为右子1,下限为右子的父节点0;
左子1的左子2上限为左子1,无下限(始终继承第一次进入递归函数时的下限即LONG_MIN);
右子1的右子2下限为右子1,无上限(始终继承第一次进入递归函数时的下限即LONG_MIN)。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool judgenow(TreeNode* root, long lower, long upper)
{
if(root == NULL)
return 1;
if(root->val <= lower || root->val >= upper)//这里的lower与upper取决于是由左子进入当前函数还是右子进入当前函数。影响持续时间为两层递归调用。
return 0;
return judgenow(root->left, lower, root->val) && judgenow(root->right, root->val, upper);
}
bool isValidBST(TreeNode* root)
{
return judgenow(root, LONG_MIN, LONG_MAX);
}
};