题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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:本来想尝试写写非递归,利用栈来写,然而我太菜了。