输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
输入:
每个测试案例包括2行:
第一行为1个整数n(1<=n<=10000),表示数组的长度。
第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。
输出:
对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出No。
样例输入:
7
5 7 6 9 11 10 8
4
7 4 6 5
样例输出:
Yes
No
推荐指数:※
来源:http://ac.jobdu.com/problem.php?pid=1367
二叉搜索树的左子树都比更小,右子数都比根大。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
bool rebuild_tree(int low,int high,long long *arr)
{
if(low>high)
return true;
int i,index=high;
long long tmp=arr[high];
for(i=low;i<high;i++){
if(arr[i]>tmp){
index=i;
break;
}
}
for(i=index+1;i<high;i++){
if(arr[i]<tmp)
return false;
}
return (rebuild_tree(low,index-1,arr)==true&&rebuild_tree(index+1,high-1,arr)==true);
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF){
long long *arr=new long long [n];
for(i=0;i<n;i++)
scanf("%lld",&arr[i]);
if(rebuild_tree(0,n-1,arr)==false)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}