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.
题目解析:
判断是否为二叉搜索树。其中的结点不能相等。
方案一:
既然递归麻烦,就利用二叉搜索树的性质,中序遍历得到有序的结果。然后再判断是否前一个值小于后一个,如果不满足就返回false。
class Solution {
public:
bool isValidBST(TreeNode *root) {
if(root == NULL)
return true;
InOrder(root);
for(int i = 0;i < arr.size()-1;i++){
if(arr[i]>=arr[i+1])
return false;
}
return true;
}
void InOrder(TreeNode *root){
if(root == NULL)
return;
InOrder(root->left);
arr.push_back(root->val);
InOrder(root->right);
}
private:
vector<int> arr;
};
方案二:
可以通过递归的形式,但我们用从下往上递归还是从上往下递归呢?
先来看看从下往上递归,递归到深层次后,函数返回最大值和最小值,然后根据从左子树返回还是右子树返回,与根判断。并更新最大值最小值再返回到更上一层。
这个思路挺麻烦,实现起来也要有很多条件判断。那么从上往下呢?我们递归到深层次的时候,先让根与上层传递的上下界判断,如果不在这个界内,就立即返回FALSE。更深层次的时候,要用当前的根来更新相应的上界或者下届。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool check(TreeNode *node, int leftVal, int rightVal)
{
if (node == NULL)
return true;
return leftVal < node->val && node->val < rightVal && check(node->left, leftVal, node->val) &&
check(node->right, node->val, rightVal);
}
bool isValidBST(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
return check(root, INT_MIN, INT_MAX);
}
};