题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
首先要知道后续遍历的特点。一个序列可以分为三个部分[a][b][c],其中c是根节点,a整个序列是c的左子树,都比c小,b整个序列是c的右子树,都比c大。然后[a]序列又可以分成3个部分,其分法与刚开始相同。而左子树a和右子树b的分界线在于,遍历,直到找到一个数比根节点C大时,就找到了边界。
递归
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence == null || sequence.length == 0) {
return false;
}
return judge(sequence, 0, sequence.length - 1);
}
public boolean judge(int [] sequence, int start, int end){
if(start>=end)
return true;//递归结束标志
int mid = start;
while(sequence[mid]<sequence[end]) //首先找到边界
mid++;
for(int i=mid;i<end;i++) {//左边确保都小于,不代表右边都小于,因此需要判断右边情况
if(sequence[i]<sequence[end])
return false;
}
return judge(sequence, start, mid-1) && judge(sequence, mid, end-1);//注意边界
}
}ps:本来想尝试写写非递归,利用栈来写,然而我太菜了。



京公网安备 11010502036488号