二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列

方法一:递归判断,将后序遍历序列的左右子树递归判断下去
因为后序遍历是:左右根节点。二叉搜索树中左节点小于根节点小于右节点。递归查找每个子树是否符合这个条件就行。

bool VerifySquenceOfBST(vector<int> sequence) {
        int l = 0;
        int r = sequence.size()-1;
        if(l>r)                                   //序列为空
            return false;
        return dfs(sequence, l, r);
    }
    
    bool dfs(vector<int>seq, int l, int r)
    {
        if(l >=r)
            return true;
        int root = seq[r];
        //先找到左子树
        int mid = 0;
        int i = l;
        for(i = l; i < r; ++i)
        {
            if(root < seq[i])
                break;
        }
        mid = i-1;
        //再判断右子树是否都大于根节点
        for(;i<r;++i)
        {
            if(root > seq[i])
                return false;
        }
        
        return dfs(seq, l, mid) && dfs(seq, mid+1, r-1);
    }

方法二:
看来其他人的解题思路,这个方法确实很巧妙。利用二叉搜索树的根节点是左子树的上限,是右子树的下限。
一个简单的例子:1 4 3 8 5,从右遍历,结点入栈是,根节点右子树,当结点小于栈顶元素时,就出栈,将前面的右子树和根结点出栈。将上限修改为根节点的值。
最开始上限不确定是多少,就用最大值。
一开始压入栈中一个最小值,确保栈不会为空。

    bool VerifySquenceOfBST(vector<int> sequence) {
        stack<int> rec;
        roots.push(INT_MIN);
        int maxval = INT_MAX;
        if(sequence.size()==0)
            return false;
        for(int i = sequence.size()-1; i >=0; i--)
        {
            if(sequence[i] > maxval)
                return false;
            //将右子树和根节点出栈,根节点作为上限。
            while(sequence[i] < rec.top())
            {
                maxval = rec.top();
                rec.pop();
            }
            rec.push(sequence[i]);
        }
        
        return true;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值