题目:
输入一个整数数组,判断该数组是否满足二叉搜索树的后序遍历。
解法:
给定数组,数组最后一个节点值肯定是根节点的值,从数组第一个节点开始,比根节点小的值一定是左子树节点,比根节点大的值一定是右子树节点。接着递归判断左子树右子树的状况。
代码如下:
#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;
}