问题:
输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
分析:
(1)后序遍历的最后一个元素一定是头结点,根据头结点对序列进行划分。
(2)划分后的子序列依然遵循(1)的规则。所以继续划分。
(3)子序列只包含1或2个节点,返回true。
(4)当划分的子序列中存在非法元素,此次判断为false。非法元素的意思是划分后左子序列应该都大于头结点,其中<头结点的元素即为非法元素。
code:
public boolean VerifySquenceOfBST(int [] sequence) { //结束条件判断 if(sequence==null || sequence.length==0) { return false; }else if(sequence.length==2 || sequence.length==1) { return true; }else { System.out.println(sequence.length); int val = sequence[sequence.length-1]; int index=0; //找到分割点 boolean flag=false; //如果子集不合法,返回false for(int i=0;i<sequence.length;i++) { if(!flag &&sequence[i]>val) { index = i; flag=true; } if(flag && sequence[i]<val) { return false; } } if(index==sequence.length || index==0) { return VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, sequence.length-1)); }else{ return (VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, index)) && VerifySquenceOfBST(Arrays.copyOfRange(sequence, index, sequence.length-1))); } } }