二元查找树的定义为:
(1)若左子树不空,则左子树上所有节点的值均小于其根节点的值。
(2)若右子树不空,则右子树上所有节点的值均小于其跟节点的值
(3)其左右子树也均为二叉查找树。
那么先给定一个数字序列5、7、6、9、11、10、8,判断这个序列是否是二元查找树的后根遍历。可以回想一下后序遍历的性质,先访问左子树,然后访问右子树,最后访问根节点。结合以上这些性质,就可以理解到,应该从给定序列的最后一个元素开始,最后一个元素设定为根节点,循环遍历一次数组,找左右子树的分界点,上面这个例子就是6,9之间。这样可以判断,5、6、7,这三个数为以8为根节点的左子树上的节点,9、11、10为以8为根节点的右子树的根节点。如果在对以上分出来的两个数组做同样的操作,那么就可以解决这个问题。综上所述,可以应用递归方法,递归的关键是找到结束的条件。下面给出代码,并进行两组测试。
#include<stdio.h>
#include<assert.h>
int verify_is_post(int *s,int length)
{
assert(s!=NULL);
assert(length>0);
int i,j;
int root=s[length-1];
for(i=0;i<length-1;i++)
{
if(s[i]>root)
break;
}
for(j=i;j<length-1;j++)
{
if(s[j]<root)
return 0;
}
int left=1;
if(i>0)
{
left=verify_is_post(s,i);//分界点左侧数组
}
int right=1;
if(i<length-1)
{
right=verify_is_post(s+i,length-i-1);//分界点右侧数组
}
return left&&right;
}
void main()
{
int s1[]={5,7,6,9,11,10,8};
int s2[]={7,4,6,5,8};
int length1=sizeof(s1)/sizeof(int);
int result1=verify_is_post(s1,length1);
if(result1)
printf("yes,it is the post-order traversal.\n");
else
printf("no,it is not the post-order traversal.\n");
int length2=sizeof(s2)/sizeof(int);
int result2=verify_is_post(s2,length2);
if(result2)
printf("yes,it is the post-order traversal.\n");
else
printf("no,it is not the post-order traversal.\n");
}
