输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:(1)二叉搜索树的特点: 左节点值 > 父节点值 > 右节点值 (2)后序遍历特点:最后一个为根节点, 从后往前找出第一小于父节点的位置, 则前面全部都为左子树 都比父节点值小.然后依次递归比较即可.
bool VerifySquenceOfBST(std::vector<int> sequence) {
bool ret = false;
do
{
if (sequence.size() == 0) {
break;
}
if (sequence.size() == 1) {
ret = true;
break;
}
ret = judgeVal(sequence, 0, sequence.size() - 1);
} while (0);
return ret;
}
// 值判断 左边的值比根节点小, 右边的值比根节点大, 后序遍历, 所以最后一个是根节点
bool judgeVal(std::vector<int> sequence, int start, int end) {
bool ret = false;
do
{
if (start >= end) {
ret = true;
break;
}
int i = end;
// 根节点为 sequence[end] 从后往前第一个比sequence[end]小的为左子树
while (i >= start&& sequence[i] >= sequence[end] && i--);
// 判断左子树 右边已经判断过了
ret = true;
for (int j = start;j <= i;++j) {
if (sequence[j] >= sequence[end]) {
ret = false;
break;
}
}
if (ret) {
// 本次正确
ret = judgeVal(sequence, start, i) && judgeVal(sequence, i==start?start:i+1, end - 1);
}
} while (0);
return ret;
}
测试