LeetCode 255. Verify Preorder Sequence in Binary Search Tree

博客介绍了判断数组是否为二叉搜索树(BST)前序遍历的两种方法。一是分治法,区分根与左右子树,判断根及左右子树是否在合理范围,时间复杂度O(nlogn);二是栈方法,维护单调递减栈,根据元素与栈顶元素大小判断左右子树,时空复杂度均为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:Divide and Conquer

数组第一个一定是根,第一个大于根的一定是右子树的根,因此我们可以把 根,左右子树都区分开来。判断根是否在合理范围内,如果在,在分别判断左右子树。思路清晰,也很容易写。

Time: O(nlogn)

class Solution {
public:
    bool verifyPreorder(vector<int>& preorder) {
        return helper(preorder,0,preorder.size()-1,INT_MIN,INT_MAX);
    }
    
    bool helper(vector<int> &preorder, int start, int end, int lower, int upper){ //[start,end]
        if (start>end) return true;
        int root_val=preorder[start];
        if (!(root_val>lower && root_val<upper)) return false;
        int i;
        for (i=start+1;i<=end;++i){
            if (preorder[i]>root_val) break;
        }
        // [start+1,i-1] and [i,end]
        return helper(preorder,start+1,i-1,lower,root_val) && helper(preorder,i,end,root_val,upper);
    }
};

 

方法二:Stack

维护一个单调递减的栈。如果当前元素比栈顶元素小,说明是左子树,压栈;否则是右子树,此时 lower_bound 要更新,因为后面的元素一定比出栈元素大了。

下面这张图可以帮助理解。时间复杂度和空间复杂度都为O(n)

 

class Solution {
public:
    bool verifyPreorder(vector<int>& preorder) {
        int lower=INT_MIN;
        stack<int> s;
        for (int x:preorder){
            if (x<=lower) return false;
            while (!s.empty() && x>s.top()){
                lower = s.top();
                s.pop();
            }
            s.push(x);
        }
        return true;
    }
};

 

转载于:https://www.cnblogs.com/hankunyan/p/9563580.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值