剑指offer-24.二叉搜索树的后序遍历序列 0 题目 1 分析

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

1 分析

后序遍历的结果,根节点在最后一个,前面的部分,前一部分是右子树,应该都小于根节点,后一部分是左子树,都大于根节点。

因此递归处理就可以了

  public:
    bool VerifySquenceOfBST(vector<int> sequence)
    {
        return aux(sequence, 0, sequence.size() - 1);
    }
    bool aux(vector<int> sequence, int begin, int end)
    {
        if (sequence.empty() || begin > end)
        {
            return false;
        }
        int root = sequence[end];
        int i = begin;

        // 找到右子树的第一个节点
        for (; i < end; ++i)
        {
            if (sequence[i] > root) //i坐标为右子树第一个节点
                break;
        }

        // 判断右子树是否符合要求
        for (int j = i; j < end; ++j)
        {
            if (sequence[j] < root)
                return false;
        }

        // 递归判断左右子树
        bool left = true;
        if (i > begin)
        {
            left = aux(sequence, begin, i - 1);
        }

        bool right = true;
        if (i < end - 1)
        {
            right = aux(sequence, i, end - 1);
        }
        return left && right;
    }

  

或是更改一下判断顺序

bool VerifySquenceOfBST(vector<int> sequence)
{
    return aux(sequence, 0, sequence.size() - 1);
}
bool aux(vector<int> sequence, int begin, int end)
{
    if (sequence.empty())
    {
        return false;
    }
    if (begin >= end)
    {
        return true;
    }
    int root = sequence[end];
    int i = begin;
    for (; i < end; ++i)
    {
        if (sequence[i] > root) //i坐标为右子树第一个节点
            break;
    }

    for (int j = i; j < end; ++j)
    {
        if (sequence[j] < root)
            return false;
    }

    bool left = true;
    left = aux(sequence, begin, i - 1);

    bool right = true;
    right = aux(sequence, i, end - 1);
    return left && right;
}