给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入: 2 / \ 1 3 输出: true示例 2:
输入: 5 / \ 1 4 / \ 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。
解法1:二叉搜索树有一个特点为中序遍历从小到大是有序的,所以,我们可以遍历的数字放在数组中,然后判断数组是否有序
class Solution {
public:
void Is(TreeNode *root,vector<int> &vec)
{
if(root)
{
Is(root->left,vec);
vec.push_back(root->val);
Is(root->right,vec);
}
}
bool isValidBST(TreeNode* root) {
vector<int> vec;
Is(root,vec);
for(int i=1;i<vec.size();i++)
{
if(vec[i]<=vec[i-1])
return false;
}
return true;
}
};
解法2:根据二叉搜索的树的概念:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
class Solution {
public:
bool is(TreeNode *root,long min,long max)
{
if(!root) return true;
if(root->val<=min||root->val>=max) return false;
return is(root->left,min,root->val)&&is(root->right,root->val,max);
}
bool isValidBST(TreeNode* root) {
return is(root,LONG_MIN,LONG_MAX);
}
};