https://leetcode.com/problems/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:
Input: 2 / \ 1 3 Output: true
Example 2:
5 / \ 1 4 / \ 3 6 Output: false Explanation: The input is: [5,1,4,null,null,3,6]. The root node's value is 5 but its right child's value is 4.
递归方法:
BST的性质决定了针对每一棵子树都需要其先祖的信息作为约束
/**
* 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 real_function(root, (long long)INT_MIN-1, (long long)INT_MAX+1);
}
bool real_function(TreeNode *root, long long minimum, long long maximum){
if(root == NULL) return true;
if((long long)root->val >= maximum || (long long)root->val <= minimum) return false;
if(real_function(root->left, minimum, root->val) && real_function(root->right, root->val, maximum))
return true;
else
return 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 {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> S;
TreeNode *cur = root;
TreeNode *pre = NULL;
while(true){
if(cur != NULL){
S.push(cur);
cur = cur->left;
}else if(!S.empty()){
cur = S.top(); S.pop();
if(pre != NULL && pre->val >= cur->val) return false;
pre = cur;
cur = cur->right;
}else{
break;
}
}
return true;
}
};
*附加一个别人的方法,逻辑上是使用的中序遍历,但是是递归完成的,其对于全局变量的使用和穿插特别巧妙
TreeNode prev = null;
public boolean isValidBST(TreeNode root) {
if(root == null){
return true;
}
boolean left = isValidBST(root.left);
if(prev != null && root.val <= prev.val) return false;
prev = root;
boolean right = isValidBST(root.right);
return left && right;
}