lettcode-验证二叉树

问题描述

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

实例

在这里插入图片描述

代码(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-验证二叉树官方题解
居然是区间的概念,虽然刚开始我想到了这个,但是后来最大值最小值的界限没弄清除,所以放弃了!!!
还在学习路上,共勉吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值