【2013创新工场电话面试】判断一个数组是否为二叉排序树的后序遍历结果

题目:

       输入一个整数数组,判断该数组是否满足二叉搜索树的后序遍历。

解法:

       给定数组,数组最后一个节点值肯定是根节点的值,从数组第一个节点开始,比根节点小的值一定是左子树节点,比根节点大的值一定是右子树节点。接着递归判断左子树右子树的状况。

代码如下:

#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; 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值