题目 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
解1 中序遍历
由于二叉搜索树的中序遍历一定是一个升序的数组,因此中序遍历二叉树,并通过设置一个全局变量pNode记录遍历到的每个结点的上一个结点,如果pNode值 >= root的值,则说明不是二叉搜索树。
另外,在设置一个全局变量flag,判断遍历过程种是否右上述所说情况,若有,则停止遍历,一路返回false。
class Solution {
bool flag = true;
TreeNode* pNode = NULL;
public:
bool isValidBST(TreeNode* root)
{
if(flag == false) return false;
if(root == NULL) return true;
if(root->left) isValidBST(root->left);
if(pNode && root->val <= pNode->val)
flag = false;
pNode = root;
if(root->right) isValidBST(root->right);
return flag;
}
};
解2 给出上下界值
class Solution {
public:
bool isValidBST(TreeNode* root)
{
//给出极限值
return getSolution(root , LONG_MIN , LONG_MAX);
}
bool getSolution(TreeNode* root , long lower , long upper)
{
if(root == NULL) return true;
//如果不在范围内则返回false
if(root->val <= lower || root->val >= upper)
return false;
//处理左子树,上值为该结点值
//处理右子树,下值值为该结点值
//返回两个相与的值
return getSolution(root->left,lower , root->val) && getSolution(root->right,root->val , upper);
}
};