题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

初始思路,但是由于语法问题,不能运行,主要是对vector截取操作的部分。

class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size()==0)
return false;
return verify(sequence,sequence.size());
}
bool verify(vector<int>& sequence,int len){
if(len==0)
return true;
int root=sequence[len-1];
int leftnum=0;
for(int i=0;i<len;i++){
if(sequence[i]<root)
leftnum++;
else
break;
}
for(int i=leftnum;i<len;i++){
if(sequence[i]<root)
return false;
}
return verify(sequence,leftnum)&&verify(sequence+leftnum,len-1-leftnum);
}
};

思路:按照后序遍历序列的规律。最后一个元素是根节点元素,则可将剩下的序列分成前一部分和后一部分。前一部分的元素都小于根节点元素,是树的左子树,后一部分序列的元素都大于根节点元素,是树的右子树。然后在递归遍历根节点的左右子树。

//成功运行的代码
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty())
return false;
return verify(sequence,0,sequence.size()-1);
}
bool verify(vector<int>& sequence,int left,int right){
if(left>=right)//返回true的条件需要格外注意
return true;
int root=sequence[right];
int numleft=0;
for(int i=left;i<right;i++){//找到前半部分和后半部分的分界线
if(sequence[i]<root)
numleft++;
else
break;
}
for(int i=left+numleft;i<right;i++){//检查后半部分是否都大于根节点
if(sequence[i]<root)
return false;
}
return verify(sequence,left,left+numleft-1)&&verify(sequence,left+numleft,right-1);
}
};

补充知识:截取vector中某一部分的数据

vector<int> vec={1,2,3,4,5,6};
vector<int>::iterator it1=vec.begin()+3;
vector<int>::iterator it2=vec.end();
vector<int> res(it1,it2);//{4,5,6}