day25:46. 二叉搜索树的后序遍历序列(递归阿里面试)

问题描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
在这里插入图片描述

由后序遍历的方式可以知道,后序遍历最后一个节点是root节点,那么选取root节点,将左右子树与root节点相比较,如果左子树所有的节点比root小,右子树所有的节点比root大,那么满足条件,否则不满足。具体写代码的时候需要找到一个区分左右子树的位置,将该树分为两部分,每一部分左边位置确定,右边位置减一,直到 l>=r,由于左子树节点均比root节点小,那么找到seq[k]<root时,那么说明是左子树上的节点,直到不满足条件的时候那么说明是该位置是区分左右子树的位置,即为所要的 k,然后再遍历右子树,如果都满足条件,那么需要进一步遍历左右子树(相对于根节点root而言例如 5 节点)里面的左右子树(相对于左右子树里面的各自子树的root而言如 2 或者 6 节点)。

class Solution {
public:
    vector<int> seq;
    bool verifyPostorder(vector<int>& postorder) {
        seq=postorder;
        return dfs(0,seq.size()-1);
    }
    bool dfs(int l,int r)
    {
        if(l>=r) return true;
        int root=seq[r];
        int k=l;
        while(k<r&&seq[k]<root) k++;
        for(int i=k;i<r;i++)
        {
            if(seq[i]<root) return false;
        }
        return dfs(l,k-1)&& dfs(k,r-1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值