题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路 (左神牛逼)
如果一个数组是二叉搜索树后序遍历的结果 那么这个数组的最后一个元素必定是头节点的值
并且这个头节点的左子树在这个数组的左边 右子树在这个数组的右边 比如数组arr = {2,1,3,6,5,7,4}
比4小的部分为{2,1,3} 比大的部分为6,5,7
我们只要找到比头节点小的最后一个值 比头节点大的第一个值 然后继续递归判断
下面是java代码实现 (注意终止条件 结合注释就可以搞懂)
public class Solution {
public boolean VerifySquenceOfBST(int[] sequence) {
if(sequence.length == 0) {
return false;
}
return VerifySquenceOfBST(sequence, 0, sequence.length - 1);
}
public boolean VerifySquenceOfBST(int[] arr, int start, int end) {
// 如果只有一个值 直接return true;
if(start == end) {
return true;
}
// 最后一个小于arr[end]的下标 先定义为-1 假设全是大于等于arr[end]的数
int less = -1;
// 第一个大于等于arr[end]的下标 先定义end 假设全是小于arr[end]的数
int more = end;
// 循环进行查找
for(int i = start; i < end; i++) {
if(arr[i] < arr[end]) {
less = i;
}else {
// 如果已经找着了 就不用变了 因为找的是第一个
more = more == end ? i : more;
}
}
// less或者more没变 说明只有右子树 或者左子树 直接去掉最后一个数 进行左子树或右子树的判断
if(less == -1 || more == end) {
return VerifySquenceOfBST(arr, start, end - 1);
}
// 左子树和右子树在数组中的值必须靠在一起
if(less != more - 1) {
return false;
}
// 判断左子树和右子树的判断
return VerifySquenceOfBST(arr, start, less) && VerifySquenceOfBST(arr, more, end - 1);
}
}