【剑指Offer】面试题33. 二叉搜索树的后序遍历序列
题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
提示:数组长度 <= 1000
思路
在后序遍历中,数组最后一个数为根节点的值,其它数字可以分为两部分,前部分为左子树的值,它们都比根节点值小;后部分为右子树的值,它们值都比根节点值大。依次递归判断判断左右子树是否满足二叉搜索树特性。
代码
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
bool verifyPostorder(vector<int>& postorder) {
int size = postorder.size();
if (size == 0) return true;
return helper(postorder, 0, size - 1);
}
bool helper(vector<int> &postorder, int start, int end) {
if (start > end) return false;
int root = postorder[end]; // 根节点值
int i = start;
for (; i < end; ++i) { // 在二叉搜索树中左子树值小于根节点值
if (postorder[i] > root) break;
}
int j = i;
for (; j < end; ++j) { // 在二叉搜索树中右子树值大于根节点值
if (postorder[j] < root) return false;
}
bool left = true, right = true;
if (i > start) left = helper(postorder, start, i - 1); //递归判断左子树是否为二叉搜索树
if (i < end) right = helper(postorder, i, end - 1); //递归判断右子树是否为二叉搜索树
return left && right;
}
};