33.二叉搜索树的后续遍历
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,
否则输出No。假设输入的数组的任意两个数字都互不相同。
分析
本题的区别之处在于,不是让你去后序遍历BST,而是给了你序列,让你来判断它是不是由一个BST的后续遍历产生的。这就要求我们对BST 已经后续遍历的特点有所了解。BST 是有序的树,树节点的值大小满足 left < root < right。 而后续遍历的顺序为: left rigth root 。
这意味着:
- 序列的最后一个节点是整棵树的根节点;
- 序列前面是left子树所在的序列,且全部小于root节点的值;
- 其余的序列都是right子树的序列,且全部大于root节点的值;
本题就是依据上面的关系去判断。
代码
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if (sequence.empty()) return false;
int i = 0, j = 0;
int root_val = sequence[sequence.size() - 1];
// left
for (; i < sequence.size(); i++) {
if (sequence[i] > root_val)
break;
}
// right
for (j = i; j < sequence.size(); j++) {
if (sequence[j] < root_val)
return false;
}
// left substree
bool left = true;
if (i > 0) {
vector<int> next(sequence.begin(), sequence.begin() + i + 1);
left = VerifySquenceOfBST(next);
}
// right substree
bool right = true;
if (j < sequence.size()) {
vector<int> next(sequence.begin() + i + 1, sequence.end());
right = VerifySquenceOfBST(next);
}
return (left && right);
}
};