题目
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a 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:
Binary tree [2,1,3], return true.
Example 2:
Binary tree [1,2,3], return false.
思路
这道题我自己的思路非常低效,因此介绍一个网友的思路。
对于每个节点来说,都有一个它一定要大于的节点和一个它一定要小于的节点,满足这个条件,这个节点才能算是BST中符合条件的一个节点。因此利用递归,传递minNode和maxNode,判断该节点是否符合条件。对于左子树的子根节点,它一定要小于它的父节点,而大于对于父节点来说的minNode(如果minNode存在)。对于右子数的子根节点,它一定要大于他的父节点,而小于对于父节点来说的maxNode(如果maxNode存在)。
代码
/**
* 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 isValidBST(TreeNode* root) {
return isValidBST(root, NULL, NULL);
}
bool isValidBST(TreeNode* root, TreeNode* min, TreeNode* max) {
if (root == NULL) {
return true;
}
if (min != NULL && root->val <= min->val || max!= NULL && root->val >= max->val) {
return false;
}
return isValidBST(root->left, min, root) && isValidBST(root->right, root, max);
}
};