1.题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
2.解题思路
二叉搜索树后序遍历为:左子树—->右子树—->根,且左子树值<根值<右子树值
如二叉搜索树:
10
/ \
6 12
/ \ / \
3 7 11 20
后序遍历结果为:3 7 6 11 20 12 10
对于一个数组sequence,最后一个元素是sequence[len-1] (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于sequence[len-1] ,后一段(右子树)大于sequence[len-1] ,且这两段(子树)都是合法的后序序列
3.代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import java.util.*; public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence==null||sequence.length<=0) { return false; } int len=sequence.length; int root=sequence[len-1]; int i=0; for(;i<len-1;i++) { if(root<=sequence[i]) break; } int j=i; for(;j<=len-1;j++) { if(root>sequence[j]) { return false; } } boolean leftflag=true; if(i>0) { leftflag=VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,i));
} boolean rightflag=true; if (i<len-1) { rightflag=VerifySquenceOfBST(Arrays.copyOfRange(sequence,i,sequence.length-1));
} return leftflag && rightflag; } }
|