题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
例如,输入数组a={5,7,6,9,11,10,8}
在后序遍历中,最后一个是树的根节点的值。二叉搜索树中,左子树节点都比根节点小,右子树节点都比根节点大。
以数组a为例,前3个数字5、7、5都比根节点小,是根节点的左子树,9、11、10都比根节点大,是根节点的右子树。
接下来用同样的方法确定数组的每一部分对应的子树结构,就是递归。
/**
* @author yuan
* @date 2019/2/15
* @description
*/
public class 二叉搜索树的后序遍历序列 {
public boolean VerifySquenceOfBST(int[] sequence, int start, int length) {
// 根节点的值
int root = sequence[length - 1];
// 二叉搜索树中左子树节点的值小于根节点
int i = start;
for (; i < length - 1; i++) {
if (sequence[i] > root) {
break;
}
}
// 二叉搜索树中右子树节点的值大于根节点
int j = i;
for (; j < length - 1; j++) {
if (sequence[j] < root) {
return false;
}
}
// 判断左子树是不是二叉搜索树
boolean left = true;
if (i > 0) {
left = VerifySquenceOfBST(sequence, 0, i);
}
// 判断右子树是不是二叉搜索树
boolean right = true;
if (i < length - 1) {
right = VerifySquenceOfBST(sequence, i, length - i - 1);
}
return left && right;
}
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence == null || sequence.length == 0) {
return false;
}
return VerifySquenceOfBST(sequence, 0, sequence.length);
}