0 题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
1 分析
后序遍历的结果,根节点在最后一个,前面的部分,前一部分是右子树,应该都小于根节点,后一部分是左子树,都大于根节点。
因此递归处理就可以了
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
return aux(sequence, 0, sequence.size() - 1);
}
bool aux(vector<int> sequence, int begin, int end)
{
if (sequence.empty() || begin > end)
{
return false;
}
int root = sequence[end];
int i = begin;
// 找到右子树的第一个节点
for (; i < end; ++i)
{
if (sequence[i] > root) //i坐标为右子树第一个节点
break;
}
// 判断右子树是否符合要求
for (int j = i; j < end; ++j)
{
if (sequence[j] < root)
return false;
}
// 递归判断左右子树
bool left = true;
if (i > begin)
{
left = aux(sequence, begin, i - 1);
}
bool right = true;
if (i < end - 1)
{
right = aux(sequence, i, end - 1);
}
return left && right;
}
或是更改一下判断顺序
bool VerifySquenceOfBST(vector<int> sequence)
{
return aux(sequence, 0, sequence.size() - 1);
}
bool aux(vector<int> sequence, int begin, int end)
{
if (sequence.empty())
{
return false;
}
if (begin >= end)
{
return true;
}
int root = sequence[end];
int i = begin;
for (; i < end; ++i)
{
if (sequence[i] > root) //i坐标为右子树第一个节点
break;
}
for (int j = i; j < end; ++j)
{
if (sequence[j] < root)
return false;
}
bool left = true;
left = aux(sequence, begin, i - 1);
bool right = true;
right = aux(sequence, i, end - 1);
return left && right;
}