题目:
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 3Binary tree
[2,1,3]
, return true.
Example 2:
1 / \ 2 3Binary tree
[1,2,3]
, return false.
解题思路:解答这道题一个简单的做法可以通过中序遍历将树转化成数组,然后判断数组是否单调递增即可;这里我用的是递归的方法,我们可以发现,每一个节点的值需要满足一定的范围,而这个范围随着访问到的节点而不断的更新,左孩子的左子树的值小于父母节点的值,右子树的值大于父母节点的值小于根的值;而右孩子的左子树的大于根的值小于父母节点的值,右子树的值大于父母节点的值。需要注意的是,当根的节点的值可能恰好为整数的最大最小值,因此边界值需要用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) {
return isvalid(root,(long)INT_MIN -1,(long)INT_MAX+1 );
}
bool isvalid(TreeNode* root,long min,long max){
if(root == NULL){
return true;
}
else if(root->val <= min || root->val >= max){
return false;
}
else{
return (isvalid(root->left, min, root->val) && isvalid(root->right, root->val, max));
}
}
};