剑指Offer——二叉搜索树的后序遍历序列

Question

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

Solution

思想就是后续遍历的最后一个节点是根节点,然后从左边往右,先是左子树再是右子树。

然后从头开始比根节点小的,作为左子树,那么剩下的节点都要求比根节点大,因为剩下的节点都将做右子树。 如果不满足则直接返回false。

如果满足的话,左子树和右子树又分别可以进行递归判断。

Code

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
		if (sequence.size() <= 0)
            return false;
        return isLastOrder(sequence, 0, sequence.size() - 1);
    }
    bool isLastOrder(vector<int>& sequence, int start, int end) {
        int rootValue = sequence[end];
        int leftEnd = start;
        while (leftEnd <= end - 1 && sequence[leftEnd] <= rootValue)
            leftEnd++;
        for (int i = leftEnd; i <= end - 1; i++) {
            if (sequence[i] < rootValue)
                return false;
        }
        int leftLength = leftEnd - start;
        int flag = true;
        if (leftLength > 0) {
            flag = isLastOrder(sequence, start, leftEnd - 1);
        }
        if (flag && leftLength < end - start) {
            flag = isLastOrder(sequence, leftEnd, end - 1);
        }
        
        return flag;
    }
};
原文地址:https://www.cnblogs.com/zhonghuasong/p/7096562.html