思路呢 就是利用后序遍历的性质吧
1 数组最后一个元素为根元素,左边都为 左子树和右子树节点。
2 根据数组的根结点以及搜索二叉树的性质,左边小 右边大 ,那么遍历左边的数组元素 找到第一个大于该元素的节点为右子树的节点
3 此时可以用递归解决问题咯
比如上题的过程如下
{5,7,6,9,11,10,8}
根节点 8
遍历 找到 9 为右子树的第一个节点
那么 可以 5 7 6为左子树 6 为左子树根结点 9 10 11 为右子树 其中11为右子树根结点
依次这么递归下去。
如何返回呢~我们知道后序遍历的性质吧,先左子树 后右子树 然后根,保证左子树的节点都小于,保证右子树的节点都大于根。那么依次这么细分 知道只剩下一个元素
代码如下
#include "stdio.h"
int judgeSortTree(int *data,int start,int last)
{
int ret =0;
int index=0;
int i =0;
if(start >=last)
{
ret=1;
return ret;
}
for(index=start;index<last;index++)
{
if(data[index]>data[last])
break;
}
for(i=start;i<index;i++) /*当然左子树检测这一步可以省去,因为如果左子树中有元素大于根元素,其毕被分到右子树中,因此不需要判断也可以。*/
{
if(data[i]>data[last])
{
return 0;
}
}
/*右子树必须大于根*/
for(i=index;i<last;i++)
{
if(data[i]<data[last])
{
return 0;
}
}
return judgeSortTree(data,start,index-1)&&judgeSortTree(data,index,last-1);
}
int main()
{
int data[]={5,7,6,9,11,10,8}; /*yes*/
// int data[] ={7,4,6,5}; /*No*/
int ret =0;
int len= sizeof(data)/sizeof(data[0]);
ret = judgeSortTree(data,0,len-1);
if(ret ==1)
{
printf("OK\n");
}
else
{
printf("No\n");
}
return 0;
}