题目:
Given the root
of a binary tree, determine if it is a valid binary search tree (BST).
A valid BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
Example 1:
Input: root = [2,1,3] Output: true
Example 2:
Input: root = [5,1,4,null,null,3,6] Output: false Explanation: The root node's value is 5 but its right child's value is 4.
Constraints:
- The number of nodes in the tree is in the range
[1, 10^4]
. -2^31 <= Node.val <= 2^31 - 1
思路:
原本思路是对于每个节点分别检查左和右,如果左右都符合规定就继续往左右子递归,否则返回false。但是如果遇到如
5
4 6
3 7
这种情况时,3符合小于6但是不符合大于5,因此我们发现了我们不仅要知道当前node的value,还需要知道当前的大小区间。对于左子,永远小于当前node的value,对于右子,需要永远大于当前node的value。因此另建递归函数,记录最大node和最小node,这里不直接记值的原因是值的范围很大,初始化不好解决,但是如果记node就只要初始化为NULL即可。如果对于当前node,有最大和最小node,则需要遵守规则,否则返回false;如果遵守则向下继续递归。
代码:
/**
* 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 {
bool isValidBST(TreeNode* root, TreeNode* minNode, TreeNode* maxNode) {
if(!root) return true;
if(minNode && root->val <= minNode->val || maxNode && root->val >= maxNode->val)
return false;
return isValidBST(root->left, minNode, root) && isValidBST(root->right, root, maxNode);
}
public:
bool isValidBST(TreeNode* root) {
return isValidBST(root, NULL, NULL);
}
};