题目
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回 true,否则返回 false。
思路
对于二叉查找树来说,其后序遍历结果最后一位一定是根节点,因此在序列中找到一个大于它的数字,位于i,从这往后肯定是这棵树的右子树,左边是左子树,只要判断[i, n-2]都大于位置n-1就可以了。这只是整体,还有进行递归去检查它的左子树和右子树满不满足二叉排序树的要求。
代码
#include <iostream>
using namespace std;
int a[10000];
bool slove(int location, int n)
{
if (location >= n)
return true;
int i = location;
while (a[i] < a[n])
{
i++;
}
for (int j=i; j<n; j++)
{
if (a[j] < a[n])
return false;
}
return slove(location, i-1) && slove(i, n-1);
}
int main()
{
int n;
cin >> n;
for (int i=0; i<n; i++)
{
cin >> a[i];
}
if (slove(0, n-1))
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
return 0;
}