二叉搜索树的后序遍历序列
题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
二叉搜索树
上图所示二叉搜索树 BST ,的后序遍历为:
132 576 4
- 最后一个元素为 根节点
- 在前面的序列中,第一个大于根节点的 元素前的 子序列 为 左子树
- 剩下的为右子树
- 如果!! 右子树中的元素有小于根节点的,那么 该序列 不是BST, 返回false。
- !!空序列返回false。。。
实现
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty()) return false; //空序列应返回false
int root = sequence.back();
int len = sequence.size();
bool isRightSubTree = false;
vector<int> leftSubTree;
vector<int> rightSubTree;
//拆分并判断左右子树是否合理,只遍历一次
for(int i=0; i<len-1; ++i) //len - 1!!
{
if(!isRightSubTree)
{
if(sequence[i]<root)
leftSubTree.push_back(sequence[i]);
else
isRightSubTree = true;
}
if(isRightSubTree)
{
if(sequence[i]>root)
rightSubTree.push_back(sequence[i]);
else
return false;
}
}
//递归判断左右子树
return (leftSubTree.empty() || VerifySquenceOfBST(leftSubTree))
&& (rightSubTree.empty() || VerifySquenceOfBST(rightSubTree));
}
};