题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路分析
- 二叉搜索树的后序遍历序列,也就是说,序列的最后一个数字是该二叉搜索树的根节点
- 然后从头至尾 - 1遍历,找到第一个比根节点大的数字的下标,然后从改下标开始到尾 - 1,看有没有出现比根节点小的数,如果有,则直接返回false,否则继续递归判断其左右子树
代码实现
public boolean verifySequenceOfBST(int[] seq) {
if (seq == null || seq.length <= 0) {
return false;
}
return verifySequenceOfBST(seq, 0, seq.length - 1);
}
private boolean verifySequenceOfBST(int[] seq, int start, int end) {
//如果子树中只剩一个数字了,那肯定为true
if (start >= end) {
return true;
}
//找到第一个比root大的
int root = seq[end], i;
for (i = start, i < end; i++) {
if (seq[i] > root) {
break;
}
}
int j = i + 1;
//判断右子树有没有比root小的,有的话直接返回false
for (; j < end; j++) {
if (seq[j] < root) {
return false;
}
}
//递归判断左右子树
return verifySequenceOfBST(seq, start, i - 1) && verify(seq, i, end - 1);
}