题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
class Solution {
public:
bool verifyPostorder(vector<int>& postorder) {
if (postorder.size() <= 1) {
return true;
}
int idx = postorder.size() - 1;
int val = postorder[idx];
int j = idx;
for (int i = 0; i < idx; i++) {
if (postorder[i] > val) {
j = i;
break;
}
}
for (int i = j + 1; i < idx; i++) {
if (postorder[i] < val) {
return false;
}
}
vector<int> vec1(postorder.begin(), postorder.begin() + j);
vector<int> vec2(postorder.begin() + j, postorder.end()-1);
bool flag1 = verifyPostorder(vec1);
bool flag2 = verifyPostorder(vec2);
return flag1 && flag2;
}
};
下面的代码有测试用例超时
class Solution {
public:
bool verify(vector<int>& postorder, int left, int right) {
if (left >= right) { //递归边界条件
return true;
}
int rootValue = postorder[right]; // 当前树的根节点的值
int k = left;
while (k < right && postorder[k] < rootValue){ // 从当前区域找到第一个大于根节点的,说明后续区域数值都在右子树中
k++;
}
for (int i = k; i < right; i++) { // 进行判断后续的区域是否所有的值都是大于当前的根节点,如果出现小于的值就直接返回false
if (postorder[i] < rootValue) {
return false;
}
}
if (!verify(postorder, 0, k - 1)) return false; //检查左子树
if (!verify(postorder, k, right - 1)) return false; //检查右子树
return true;
}
bool verifyPostorder(vector<int>& postorder) {
if (postorder.size() < 2) {
return true;
}
else {
return verify(postorder, 0, postorder.size()-1);
}
}
};