题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
分析:在后序遍历中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两个部分,第一个部分是左子树节点的值,他们都比根节点的值小;第二个部分是右子树节点的值,他们都比根节点的值大。因此从头遍历整个数组,当遇到一个大于根节点的数时,将前面的都划为左子树,继续遍历,如果后面有一个小于根节点的值,则不是后序遍历数组;如果后面的所有数都小于根节点的值,则继续递归遍历下去,代码如下(是根据在牛客网上给的函数原型写的):
1 bool VerifySquenceOfBST(vector<int> sequence) { 2 if(sequence.size()<=0) 3 return false; 4 return Judge(sequence,0,sequence.size()-1); 5 } 6 7 bool Judge(vector<int> sequence,int l,int r){ 8 int i=l,j; 9 for(;i<r;i++){ 10 if(sequence[i]>sequence[r]) 11 break; 12 } 13 for(j=i;j<r;j++){ 14 if(sequence[j]<sequence[r]) 15 return false; 16 } 17 bool leftJudge = true; 18 bool rightJudge = true; 19 if(i>0) 20 leftJudge = Judge(sequence,0,i-2); 21 if(i<r) 22 rightJudge = Judge(sequence,i-1,r-1); 23 return leftJudge&&rightJudge; 24 }