找工作笔试-广联达-判断是否为后续排序

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。

例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:

         8
       /  \
      6    10
    / \    / \
   5   7   9  11

因此返回true。

如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。


思路:对于有关二叉树的问题基本都要涉及到递归的思想,而对于本题,由于是后序遍历,则最后一个数字肯定是根节点,从根节点出发,如果比根节点大则都在右子树,且位于序列的右半部分;比根节点小的都在左子树,且位于序列的左半部分。

#define NULL 0
#define FALSE 0
#define TRUE 1
#define Status int

#include<stdio.h>
Status test(int *a,int start,int end,Status tag){
	if(tag && start<end)
	{
		int i,left = start;
		while(a[left]<a[end])
		{
			left++;//找到左子树
		}
		for(i=left;i<end;i++)
		{
			if(a[i]<a[end])
				tag = 0;//如果右子树还有小于根节点的数,则不是后序遍历
		}
		test(a,0,left-1,tag);
		test(a,left,end-1,tag);
	}
	return tag;
}
int main(void)
{
	Status tag = TRUE;
	int a[]={5,7,6,9,11,10,8};
	int b[]={7,4,6,5};
	test(a,0,6,tag);
	if (tag) 
		printf("a,yes\n");
	else
		printf("a,no!\n");
	tag = FALSE;
		test(b,0,3,tag);
	if (tag) 
		printf("b,yes\n");
	else
		printf("b,no!\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值