#include <cstdlib>
#include <iostream>
using namespace std;
//判断一个序列是不是二叉查找树的后序遍历结果
//2013.05.22 PM
bool isBack(int *p, int begin, int end)
{
//边界值判断
if(begin>end)
return false;
//序列为空或者只有一个元素,不用判断,怎样都是真
//if(end==0 ||end==1),这个判断有问题,
//return true;
if(begin==end)
return true;
//后序遍历最后一个元素是根
int root=*(p+end);
int i=begin;
//开始的下标,直到遇到比根大的 元素停止。
for(i;i!=end;++i)
{
if(*(p+i)>root)
break;
}
//mid的位置是第一个比root大的元素的位置
int mid=i;
//从这点开始,出现比根小的元素停止,说明不是后序的
for(int j=mid;j!=end;++j)
{
if(*(p+j)<root)
return false;
}
//递归左边的序列
bool left =isBack(p,begin,mid-1);
//递归右边的序列
bool right =isBack(p,mid,end-1);
return (left&&right);
}
int main(int argc, char *argv[])
{
//二叉查找树序列{1 2 3 4 5 6 7}
//的后序排列为 1325764;
//结果为真
int arr[]={1,3,2,5,7,6,4};
//int *p=arr;
bool res=isBack(arr,0,6);
cout<<res<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}