问题:验证一个给定的序列是否可能是某一棵二叉查找树的后续遍历序列。如果是则返回1,否则返回0。假设输入的数组的任意元素都不相同;
代码如下:仅供参考。
#include <iostream>
#define TRUE 1
#define FALSE 0
using namespace std;
//data [stat,end]
//验证data中的元素是否为某棵二叉查找树的后续遍历
bool IsFindTreePostOrder(int *data,int start,int end)
{
if(!data)
return TRUE;
if (start>=end)
return TRUE;
int root=*(data+end);//最后一个元素是根元素
int i,j;
for (i=end;i>start&&*(data+i-1)>root;i--);//[end-1,i] 右子树应该包含的元素
for(j=i;j>start&&*(data+j-1)<root;j--);//[i-1,j] 左子树应该包含的元素 另外如果j==stat 说明以root为根成功的将所有元素分为左右子树
if(j>start) //以root为根未能将所有元素分为左右子树,故不可能是某棵二叉查找树的后续遍历
return FALSE;
return IsFindTreePostOrder(data,i,end-1)&&//验证data右子树是否为某棵二叉查找树的后续遍历
IsFindTreePostOrder(data,j,i-1);//验证data左子树是否为某棵二叉查找树的后续遍历
}
int main()
{
int data[]={7,4,5,6};
cout<<IsFindTreePostOrder(data,0,3)<<endl;
}