题目:输入一个整数数组,判断该数组是不是某个二叉搜索数的后续遍历的结果。如果是则返回true,否则返回false。假如输入的数组的任意两个数组都互不相同
思路:
后续遍历,最后一个元素为root。BST的特点是左子树所有节点小于等于root,右子树所有子节点均大于等于root。
递归,找到可能是左子树的序列,余下的为右子树的序列。判定候选的右子树序列是否满足大于等于root的条件。若满足,递归左右子树判断
编译环境:ArchLinux+Clang3.3,C++11
实现一:
#include <iostream>
#include <cassert>
using namespace std;
bool checkSeqOfBST(int *seq, int len)
{
if (!seq || len < 1) return false;
int root = seq[len - 1];
int *ptr = seq;
int *end = seq + len - 1; // excluding
while (ptr < end && *ptr <= root) ptr++; // 搜索[seq, end), 循环结束后,ptr左边为左子树(若有)
int leftLen = ptr - seq;
while (ptr < end) { // 遍历[ptr, end),初步验证是否为右子树
if (*ptr < root)
return false;
ptr++;
}
bool left = leftLen > 0
? true
: checkSeqOfBST(seq, leftLen); // 验证左子树
bool right = len - leftLen - 1 > 0
? true
: checkSeqOfBST(seq+leftLen, len - 1 - leftLen); // 验证右子树
return left && right;
}
int main()
{
int a[] {5,7,6,9,11,10,8};
int b[] {7,4,6,5};
assert(checkSeqOfBST(a, sizeof(a)/sizeof(int)));
assert(!checkSeqOfBST(b, sizeof(b)/sizeof(int)));
}