/*
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
树的题目一般都是递归的思路,因为是因为是排序树,而且是后序,所以思路是序列最后一个必是根节点,
从前往后遍历,比根节点小的都是其左子树,并且位于序列的左半部分,
比其大的为其右子树,应该位于其右半部分。左右子树按上述思路分别进行判断。
*/
#include<iostream>
using namespace std;
void testPostorder(const int data[],int start,int root,bool &flag){
if(flag&&start<root){ // 判断条件,注意start<root
int left=start;
while(data[root]>data[left]){ //取得其左子树
left++;
}
for(int j=left;j<root;j++){ //判断是否为其右子树
if(data[j]<data[root]) {flag=false; return;}
}
testPostorder(data,0,left-1,flag); //递归
testPostorder(data,left,root-1,flag);
}
else
return;
}
//测试是否是前序遍历结果
void testPreorder(const int data[],int root,int end,bool &flag){
if(flag&&root<end){ // 判断条件,注意start<root
int right=end;
while(data[root]<data[right]){ //取得其右子树
right--;
}
right++;
for(int j=root+1;j<right;j++){ //判断是否为其左子树
if(data[j]>data[root]) {flag=false; return;}
}
testPreorder(data,root+1,right-1,flag); //递归
testPreorder(data,right,end,flag);
}
else
return;
}
int main(void){
bool flag=true;
int a[]={5,7,6,9,11,10,8};
testPostorder(a,0,sizeof(a)/sizeof(*a)-1,flag);
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
flag=true;
int b[]={7,4,6,5};
testPostorder(b,0,sizeof(b)/sizeof(*b)-1,flag);
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
flag=true;
int c[]={8,6,5,7,10,9,11};
testPreorder(c,0,sizeof(c)/sizeof(*c)-1,flag);
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
return 0;
}