题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回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");
}