/**
* 输入一个整数数组,
* 判断该数组是不是某二叉搜索树的后序遍历的结果。
* 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
*/
package com.java.offer;
public class Solution10 {
/**
* 输入一个整数数组, 判断该数组是不是某二叉搜索树的后序遍历的结果。 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
*/
// 1. 什么是二叉搜索树?也就是二叉排序树:是空树 或者 满足左子树节点小于根节点 右子树大于根
// 后序遍历:左右根 最后一个数是根节点
// 遍历序列 找到第一个大于root的位置 该位置左边为左子树 右边为右子树
// 遍历右子树 若发现有小于root的值 直接返回false
// 分别判断左子树和右子树是否仍是二叉搜索树
// 一般关于二叉树的题目 :可以考虑递归 因为左右子树都是类似的操作
// 5 7 6 9 11 10 8
// 1.先root=8 左子树 5 7 6 右子树9 11 10
// 2. 对左子树 5 7 6 、、6变成左子树的根节点 5 7
// 3. 右子树的判断也是一样的
public boolean VerifySquenceOfBST(int[] sequence) {
if (sequence.length == 0)
return false;
if (sequence.length == 1)
return true;
return isAfterOrder(sequence, 0, sequence.length - 1);
}
private boolean isAfterOrder(int[] seq, int start, int root) {
if (start >= root) {
return true;
}
int i = root;
// 从后面开始找,若有数字比根节点大,找到i的位置,也就是9的位置
while (i > start && seq[i - 1] > seq[root]) {
i--;
}
for (int j = start; j < i - 1; j++) {
// 左子树节点一定比根节点小
if (seq[j] > seq[root])
return false;
}
boolean flag = isAfterOrder(seq, start, i - 1) && isAfterOrder(seq, i, root - 1);
return flag;
}
}