题目描述
给定一个有 n 个不重复整数的数组 arr,判断 arr 是否可能是节点值类型为整数的搜索二叉树后序遍历的结果。
输入描述:
第一行一个整数 n,表示数组的长度。
第二行 n 个整数 arr_i。
输出描述:
如果是搜索二叉树后序遍历的结果则输出 “true”,否则输出 “false”。
示例1
输入
复制
3
1 3 2
输出
复制
true
这到题其实是判断是否是二叉搜索树,
判断标准: 最后一个数a[ end ]为标准,找到a[ less ](数组中最后一个小于a[ end ]的数),找到a[ more ],数组中第一个大于a[ end ]的数,如果less!=more-1,输出false ,反之亦然。
#include<iostream>
using namespace std;
int a[500007];
bool isBST(int a[],int start,int end)//判断是否是平衡二叉树
{
if(start==end)
return true;
int less=-1,more=end;
for(int i=start;i<end;i++)
{
if(a[i]<a[end])
less=i;//最后一个比 a[end]小的数
else
more= more==end? i:more;//more为第一个比 a[end] 大的数
}
if(less==-1 || more==end ) //此时树是一个左斜树或右斜树。
{
return isBST(a,start,end-1);
}
else if( less==more-1)
{
return isBST(a,start, less) && isBST(a,more,end-1);
}
else
return false;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
bool k=isBST(a,0,n-1);
if(k)
cout<<"true"<<endl;
else
cout<<"false"<<endl;
return 0;
}