题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
分析
思路:
1、由后序遍历的特点可知,最后一个结点即为根节点,设为rootVal
2、根节点会将二叉搜索树,分为两部分,左半部分和右半部分
3、左半部分都小于根节点值,右半部分都大于根节点值
4、得到两部分后,子树又可以像上述一样,确定子树根节点,然后又分两部分,如此往复
实现代码:
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int len = sequence.length;
if (sequence == null || len == 0) {
return false;
}
boolean result = verifySquenceOfBST(sequence, 0, len - 1);
return result;
}
private boolean verifySquenceOfBST(int [] sequence, int begin, int end) {
// 一个元素时,为后序遍历序列,可能只有两个数,根节点+其他一个数,那么此时begin传的值为leftEnd+1,就会比end大
if (begin >= end) {
return true;
}
// root节点的值
int rootVal = sequence[end];
// 序列中的最后一个左子树节点,一开始是seq[0]
int leftEnd = begin;
int i = begin;
// 遍历找到左子树的序列 与 右子树序列, 获取分割索引
while (sequence[i] < rootVal) {
leftEnd = i;
i++;
}
// 判断leftEnd序列后的值,如果存在元素小于rootVal,则不是后序序列
while (i < end) {
if (sequence[i] < rootVal) {
return false;
}
i++;
}
//根节点将树分成两部分后,继续递归遍历左右子树
return verifySquenceOfBST(sequence, begin, leftEnd) && verifySquenceOfBST(sequence, leftEnd+1, end-1);
}
}