98. Validate Binary Search Tree
原题:
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:
2
/ \
1 3
Binary tree [2,1,3]
, return true.
Example 2:
1
/ \
2 3
Binary tree [1,2,3]
, return false.
题解:
要判断一个二叉树是不是二叉搜索树,要满足几个条件:
1. 当前节点的左子树的所有节点的值,都比当前节点的值要小。
2. 当前节点的右子树的所有节点的值,都比当前节点的值要大。
3. 当前节点的左右子树,还是二叉搜索树。
因此,用DFS的过程中,要限定一个范围,当前节点的值的最大最小范围,分别用minn
和maxn
表示,在深搜之前,判断当前节点是否满足这个范围条件,如果满足,就更新范围往下搜索。
往左子树搜索的时候,更新maxn
为更小的值,往右则相反。
这里右一个坑,就是测试会有卡在INT_MAX
和INT_MIN
的样例,所以我们的minn
和maxn
要使用long类型。
代码:
/**
* 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) {
if(! root) {
return true;
}
bool l=true, r=true;
if(root->left) {
l = dfs(root->left, LONG_MIN, root->val);
}
if(root->right) {
r = dfs(root->right, root->val, LONG_MAX);
}
return l && r;
}
bool dfs(TreeNode* now, long minn, long maxn) {
cout << now->val << ", " << minn << ", " << maxn << endl;
if(now->val <= minn || now->val >= maxn) {
return false;
}
bool l=true, r=true;
if(now->left) {
l = dfs(now->left, minn, min(static_cast<long>(now->val), maxn));
}
if(now->right) {
r = dfs(now->right, max(static_cast<long>(now->val), minn), maxn);
}
return l&&r;
}
};