输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
剑指 Offer 33. 二叉搜索树的后序遍历序列 - 力扣(LeetCode) (leetcode-cn.com)
思路:后序遍历先输出左子树,再输出右子树,最后输出根节点;根据二叉搜索树的特点,左子树的值总是小于根节点,右子树的值总是大于根节点;可知,如果一个序列是二叉搜索树的后序遍历序列,最后一个值是根节点,前面的部分可以分为比根节点小的左子树和比根节点大的右子树,否则就不是二叉搜索树,然后再递归地判断左右子树是不是二叉搜索树。
class Solution {
public boolean verifyPostorder(int[] postorder) {
if(postorder.length <= 1){
return true;
}
return verify(postorder, 0, postorder.length - 1);
}
public boolean verify(int[] arr, int start, int end){
if(start >= end){
return true;
}
int mid = start;
int i = start;
while(i < end && arr[i] < arr[end]){
i++;
}
mid = i;
while(i < end){
if(arr[i] > arr[end]){
i++;
}else{
return false;
}
}
return verify(arr, start, mid - 1) && verify(arr, mid, end - 1);
}
}