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;
}
};