问题描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
实例
代码(c++)
方法一
思想是纯递归,先通过递归遍历到最后的叶子结点,然后从叶子结点向上返回当前最大值和最小值,得到返回值的结点判断是否大于左子树中的最大值,小于右子树中的最小值。
注意在途中遇到界限值 2147483647 以及 -2147483648 的处理(这个处理刚开始没弄好,调了将近一个小时)
class Solution {
public:
bool isValidBST(TreeNode* root) {
error=-100;
if(root==NULL||(root->left==NULL&&root->right==NULL)) return true;
pair<long long,long long> data=is(root);
if(data.first!=error&& data.second!=error) return true;
else return false;
}
pair<long long,long long> is(TreeNode* root){//type represent the tree is left tree(1) or right tree(2)
pair<long long,long long> dataL;
pair<long long,long long> dataR;
int stateL=0,stateR=0;
long long temproot=root->val;
long long maxvalue=root->val,minValue=root->val;
long long minV=temproot,maxV=temproot;
if(root->left!= NULL){
dataL=is(root->left);
if(dataL.first==error) return dataL;
maxvalue=dataL.first;
stateL=1;
if(maxvalue==temproot) return pair<long long,long long>(error,error);
minV=dataL.second;
}
if(root->right!=NULL){
dataR= is(root->right);
if(dataR.first==error) return dataR;
minValue=dataR.second;
stateR=1;
if(minValue==temproot) return pair<long long,long long>(error,error);
maxV=dataR.first;
}
if(root->left==NULL&&root->right==NULL){
return pair<long long,long long>(temproot,temproot);
}
//处理结点,
if(((root->val == maxvalue&&stateL==0)||root->val > maxvalue)&&((root->val == minValue&&stateR==0)|| root->val < minValue)){
return pair<long long,long long>(maxV,minV);
}
return pair<long long,long long>(error,error);
}
private:
int error;
};
下面的这句话是用来标识在左子树为空的条件下使当前结点通过,否则纯“大于”的话,当前结点值怎么能大于当前结点值呢
root->val == maxvalue&&stateL==0
方法二(官方解答)
不得不说我还是太菜
class Solution {
public:
bool helper(TreeNode* root, long long lower, long long upper) {
if (root == nullptr) return true;
if (root -> val <= lower || root -> val >= upper) return false;
return helper(root -> left, lower, root -> val) && helper(root -> right, root -> val, upper);
}
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX);
}
};
解释链接:lettcode-验证二叉树官方题解
居然是区间的概念,虽然刚开始我想到了这个,但是后来最大值最小值的界限没弄清除,所以放弃了!!!
还在学习路上,共勉吧