题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果

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

 

  1. #include <iostream>   
  2. using namespace std;  
  3.  
  4. bool verifySequenceOfBST(int sequence[],int length)  
  5. {  
  6.     if(sequence==NULL||length==0)  
  7.         return false;  
  8.     int root=sequence[length-1];  
  9.     for(int i=0;i<length-1;i++)  
  10.     {  
  11.         if(sequence[i]>root)  
  12.             break;  
  13.     }  
  14.     for(int j=i;j<length-1;j++)  
  15.     {  
  16.         if(sequence[j]<root)  
  17.             return false;  
  18.     }  
  19.     bool right=true;  
  20.     if(i<length-1)  
  21.         right=verifySequenceOfBST(sequence+i,length-i-1);  
  22.     bool left=true;  
  23.     if(i>0)  
  24.         left=verifySequenceOfBST(sequence,i);  
  25.     return (left&&right);  
  26. }  
  27.  
  28.  
  29. void main()  
  30. {  
  31.     int a[]={5,7,6,9,11,10,8};  
  32.     bool t=verifySequenceOfBST(a,7);  
  33.     cout<<t;