剑指offer题目23:二叉搜索树的后序遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解答思路
问题不难,就是一开始看漏了是说二叉搜索树而不是二叉树而卡了一下,后面知道二叉搜索树的定义就是左子树比根要小,右子树要比根要大就有了思路了。
首先是自己构建1个二叉搜索树构思一下。

上面的二叉树后序输出是:5,7,6,9,11,10,8

错误的二叉树输出有:5,12,6,9,11,10,8
通过观察我们得出正确二叉树的规律:
- 输出的最后1个节点肯定是根
- 前面的连续的比根节点要小的都是左子树
- 后面的连续的比根节点要大的都是右子树
如果不符合上面2,3点的肯定是错误搜索树,我们在观察一下,在程序上的表现就是当出现1个比根节点要大的元素a的话,a和后面的元素都是右子树。不可能在出现比根要小的元素。
实现代码
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
bool result = false;
if(sequence.size()) {
int rootIndex = sequence.size() - 1;
int root = sequence[rootIndex];
vector<int> leftTree;
vector<int> rightTree;
// 分类左右子树且判断当前左子树是否全部小于跟,右子树全部大于跟
for (int i = 0; i < rootIndex - 1; ++i)
{
if(sequence[i] < root) {
if(rightTree.size()) {
return false;
}
leftTree.push_back(sequence[i]);
} else {
rightTree.push_back(sequence[i]);
}
}
result = true;
if(leftTree.size()) {
result = result && VerifySquenceOfBST(leftTree);
}
if(result && rightTree.size()) {
result = result && VerifySquenceOfBST(rightTree);
}
}
return result;
}
};
作者:大傻逼
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号