剑指Offer面试题24
题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
分析:
后序遍历的序列中:左子树 + 右子树 +根节点
并且: 左子树的值 < 根节点 < 右子树的值
所以数组中最后一位是根节点,前半部分小于根节点为左子树,后半部分大于根节点为右子树
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
//左子树 + 右子树 + 根节点
//左子树的值 < 根节点 < 右子树
int len = sequence.size();
if(len <= 0)
return false;
//根节点的值
int root = sequence[len - 1];
vector<int> leftSequence;
vector<int> rightSequence;
//在二叉树中,左子树的值小于根节点的值
int i = 0;
for(; i < len - 1; i++)
{
if(sequence[i] <= root)
leftSequence.push_back(sequence[i]);
else
break;
}
//在二叉树中,右子树的值比根节点的值大
int j = i;
for(;j < len - 1; j++)
{
if(sequence[j] > root)
rightSequence.push_back(sequence[j]);
else
return false;
}
//判断左子树是不是后序遍历的二叉搜索树
bool left = true;
if(i > 0)
left = VerifySquenceOfBST(leftSequence);
//判断右子树是不是后序遍历的二叉搜索树
bool right = true;
if(i < len - 1)
right = VerifySquenceOfBST(rightSequence);
return (left && right);
}
};