题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
/**
* 思路:后序遍历是,左右根,所以序列的最后一个元素是根元素,左子树都小于根,右子树都大于根
* 步骤1:找到root的元素
* 步骤2:遍历序列找到第一个比root大的元素,前面的都是左子树,此元素以及后面的都是右子树
* 步骤3:遍历后面的后子树的元素,如果有比根小的,说明不是搜索树
* 步骤4:以相同的方法递归遍历左子树和右子树,重复1-3步骤
*/
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int length = sequence.size();
if(length == 0) return false;
if(length == 1) return true;
vector<int> left;
vector<int> right;
int rootval = sequence[length-1];
int index = 0;
for(int i = 0; i < length-1; i++){
if(sequence[i] < rootval){
left.push_back(sequence[i]);
}else{
index = i;
break;
}
//未能通过所有测试用例原因:没有考虑只有左子树的情况
if(i == length-2) return true;
}
for(int i = index; i < length-1; i++){
right.push_back(sequence[i]);
if(sequence[i] < rootval){
return false;
}
//if(i == length-2) return true;//这句加或者不加都可以通过所有的测试用例,建议还是不加吧
}
bool leftres = true,rightres = true;
if(left.size() != 0) leftres = VerifySquenceOfBST(left);
if(right.size() != 0) rightres = VerifySquenceOfBST(right);
return (leftres && rightres);
}
};