输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
分析:二叉搜索树的特点,左子树的值一定小于根结点,右子树上的值一定大于根结点;
后序遍历:左右中,所以根结点一定位于数组的最后
以根结点的值为依据,先遍历出数组前面小于root值的节点,为root的左子树的值,再从该点出发遍历到root之前的值,若没有小于root的值,则对左右子树再进行递归。
//引入Arrays.copyOfRange(int[] A,int a,int b);从a到b的索引取出作为一个新的数组 import java.util.Arrays; public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence==null||sequence.length<=0) return false; int root=sequence[sequence.length-1]; int i=0; //-1 不算入root节点 while(i<sequence.length-1){ if(sequence[i]>root){ break; } i++; } for(int j=i;j<sequence.length-1;j++){ if(sequence[j]<root){ return false; } } //int[] sequence1=Arrays.copyOfRange(sequence,0,i-1); //int[] sequence2=Arrays.copyOfRange(sequence,i,sequence.length-2); boolean left=true; //此处原本设置的判断条件为i>0,可是会导致每次Arrays.copyOfRange一直在缩小sequence的长度,直到缩小到null, //会时left会调用VerifySquenceOfBST,执行第五行代码,然后返回值为false,设置为1就不会再出现这样的问题 //其实可以发现,只要sequence的元素个数在1-3个之间都会返回true if(i>1) left=VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,i-1)); boolean right=true; if(i<sequence.length-1) right=VerifySquenceOfBST(Arrays.copyOfRange(sequence,i,sequence.length-2)); return (left&&right); } }