输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
* 递归实现检测
*
* 对于后序遍历来说,序列数组的最后一个元素一定是根节点,
* 则根据这个元素,将前面的数组分为左、右两个部分,左侧部分都小,右侧部分都大,
* 如果右侧部分有比该根节点小的元素,那么就不是后序遍历,如此递归进行(左半部分在上一步骤已经比较过了,所以不需要比较啦)
bool search(vector<int>&a,int start,int end) { if(start>end)//遍历完数组的一部分,没有报错,返回true { return true; } int i; int rootVal=a[end];//根节点的值 for(i=start;i<end-1;i++)//从左到右找第一个大于根节点的值(即将数组分为两部分,左边小于根,右边大于根) if(a[i]>rootVal) break; //从位置i此处去遍历数组,如果出现小于根节点的值,则返回false for(int j=i;j<end-1;j++) if(a[j]<rootVal) return false; //确保左右子树部分仍然是后续序列 return search(a,start,i-1)&&search(a,i,end-1); } bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size()==0) return false; if(sequence.size()==1) return true; int len=sequence.size(); return search(sequence,0,len-1); }