判断整数序列是不是二元查找树的后序遍历结果

          今天看到判断整数序列是不是二元查找树的后续遍历结果的题目,看的那个题目的时候提供了答案,然后感觉那个答案很明显不对劲,应该是有的字母打错了。  便想照着他的思路写下去,但是怎么写都不对劲,跟自己的思路就是搭不上,便上网查了下有没有简单的思路,但是还是怎么看都不是很满意,最后还是自己想想还是要快些。虽然都是用的递归,但是先想的哪一步每个人还是有区别的。       哎,以后还是尽量要自己动脑想啊。

      

判断后序遍历,毋庸置疑是用递归是最简单省事的。但是在递归之前先判断了下左子树和右子树是不是满足左子树的元素都小于最后一个元素和右子树的元素是不是都满足最后一个元素,并且当这两个条件都满足的时候,当数组只有一个元素或者两个元素那么这个肯定满足后序遍历的。 之后再判断两个子树的游标之差是否满足一定的条件, 最后便是分别遍历左子树和右子树了。代码如下: 

#include <stdio.h>
#include <stdlib.h>

int helper(int a[], int begin, int end)
{
	if(begin == end || begin==end-1) return true;
	int i=begin, k=end-1;
	while(a[i]<a[end] && i<end) i++;             //遍历左子树
	while(a[k]>a[end] && k>begin) k--;			//遍历右子树
	//i==0&&k==0 是当树是只有右节点的二叉树时,只有左节点则包含在abs(i-k)==1中
	if(!(i==0 && k==0 || abs(i-k) ==1))			
		return false;
	return helper(a, begin, i-1)&&helper(a, k+1, end-1);
}


int main()
{
	//int a[] = {5,7,6,9,11,12,10,8};
	int a[] = {3,4,6,5};
	printf("%d\n", helper(a, 0, sizeof(a)/sizeof(int*)-1));
	getchar();
}
如有错误,请不吝指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值