今天做九度1367题
-
题目描述:
-
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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
因此代码如下
#include <stdio.h>
#define MAX 10001
int isValid(int data[],int n){
int i=0;
int j;
int left=1,right=1;
int root=data[n-1];
//i记录root左节点长度
while(data[i]<root){
i++;
}
//j记录root右节点长度
for(j=i;j<n-1;j++){
//如果右子树节点有比root值小的,则不符合定义
if(data[j]<root)
return 0;
}
//递归判断左子树节点
if(i>0)
left=isValid(data,i);
//递归判断右子树节点
if(i<n-1)
right=isValid(data+i,n-i-1);
return (left&&right);
}
int main(){
int data[MAX];
int n,i;
int flag;
while(scanf("%d\n",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%d",&data[i]);
}
flag=isValid(data,n);
if(flag==1)
printf("Yes\n");
else if(flag==0)
printf("No\n");
}
return 0;
}