您的位置:首页 > 其它

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

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

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

#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();
}
如有错误,请不吝指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐