leetcode刷题笔记--验证二叉搜索树

大致看了一下题解,主要是两种思路:第一种思路就是利用递归进行遍历

第二种思路是利用中序遍历,中序遍历又有两种思路,一种就是利用递归进行中序遍历,另一种就是利用栈来模拟。都行应该

好烦,好难,头大

有个简单的问题~,什么是递归~,它是否是一种引力,还是一种味道

思路一:简单的来说就是下界设为无穷,上界设为无穷(一开始的时候)然后递归找下界,再找上界,如果递归的节点小于上界且在它的右边,那说明递归到一个不是bst的树了。一个不是bst的树配上一个是bst的树,那么一定不是bst树。得到结果。

中序遍历就是利用我们的发现(依据题目的意思可以发现左中右是依次上升的),发现中序遍历出来的一定是一个上升的序列。那么就只要递归来中序遍历,然后检查是否递增就行了。还有一种思路就是利用栈进行模拟,如果是一个递增的,就没问题了

第一个题解:

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);
    }
};

>

第二个题解:

class Solution{

    public:

    bool isValidBST(TreeNode* root){

        stack<TreeNode> stack;

        long long inorder=(long long)INT_MIN-1;

        while(!stack.empty()||root!=nullptr){//两层while嵌套循环,外层用来遍历所有的节点(即左节点和右节点)

            while(root!=nullptr){//里层用来遍历所有的左节点

                stack.push(root);

                root=root->left;

            }

            root=stack.top();

            stack.pop();

            if(root->val<=inorder){

                return false;

            }

            inorder=root->val;

            root=root->right;//用来遍历所有的右节点

        }

        return true;

    }

};

 

 

用栈进行模拟的

 

 

 

还有一种就是直接利用中序递归来完成的:

clss Solution{

    public:

    long pre=-100000;

    bool isValidBST(TreeNode* root){

        if(!root){

            return true;

        }

        if(!isValidBST(root->left)||pre>=root->val)

        return false;

        return isValidBST(root->right);

    }

};

//leetcode题解里找的。很简短的中序遍历代码,但还真不是很好想滴

/*大致思路是这样的:首先如果是空树,那就直接符合题目要求了,所以返回true。那如果是非空的树,就先遍历左边,一直遍历到跟节点

此时会返回一个true,也就是说!isValidBST为false。然后就开始判断||后面的pre>=root->val是真是假,如果这个是真的,那就返回false。如果

这个是假的话呢,就直接跳过这个if语句。然后开始到右节点。右节点又递归到左节点,继续依此判断,循环往复。直到所有节点判断完毕,此时会给出

最终的结果,是false还是true*/

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值