判断该数组是某二元查找树的后序遍历

输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
      8
    /  \
  6  10
 /  \ /  \
5  7 9  11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
分析:主要考查对二元查找树的理解。
在 后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前 面的一个元素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据这样的划分,把序列划分为左右两部分,我们递归地确认序列的左、右 两部分是不是都是二元查找树。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include<string.h>
 4 
 5 int main()
 6 {
 7     int IsSquenceBSTree(int *p,int length);
 8     int a[7]={9,4,6,7,8,12,10};
 9     if(IsSquenceBSTree(a,7))
10     printf("Is SquenceBSTree");
11     else
12     printf("Not a SquenceBSTree");
13     return 0;
14 }
15 
16 int IsSquenceBSTree(int *p,int length)
17 {
18     if(p==NULL&&length<=0)
19     return 0;
20     int root=p[length-1];
21     int i=0,j=0;
22     int bLeft=1,bRight=1;
23     for(i=0;i<length-1;i++)
24     {
25         if(p[i]>root)
26         break;
27     }
28     j=i;
29     for(;j<length-1;j++)
30     {
31         if(p[j]<root)
32         return 0;
33     }
34     if(i>0)
35     bLeft=IsSquenceBSTree(p,i);
36     if(j<length-1)
37     bRight=IsSquenceBSTree(p+i,length-i-1);
38     return (bLeft+bRight)/2;
39 }
原文地址:https://www.cnblogs.com/nannanITeye/p/3130995.html