document.write('
二元查找树的特点是:对于任意一个结点,它的左子树上所有结点的值都小于这个结点的值,它的右子树上
所有结点的值都大于这个结点的值。根据它的这个特点以及二元查找树后序遍历的特点,可以看出,这个序
列的最后一个元素一定是树的根结点(上图中的结点4),然后在数组中找到第一个大于根结点4的值5,那么结
点5之前的序列(1,3,2)对应的结点一定位于结点4的左子树上,结点5(包含这个结点)后面的序列一定位于
结点4的右子树上(也就是说结点5后面的所有值都应该大于或等于4)。对于结点4的左子树遍历的序列{1,3,
2}以及右子树的遍历序列{5,7,6}可以采用同样的方法来分析,因此,可以通过递归方法来实现,实现代码
如下:
 """
 方法功能: 判断一个数组是否是二元查找树的后续遍历序列
 输入参数: arr:数组:
 返回值: true:是, 否则返回false
 """
 def IsAfterOrder(arr,start,end):
 if arr==None:
 return False
 #数组的最后一个结点必定是根结点
 root=arr[end]
 #找到第一个大于root的值, 那么前面所有的结点都位于root的左子树上
 i=start
 while i<end:
 if(arr[i]>root):
 break
 i+=1
 #如果序列是后续遍历的序列, 那么从i开始的所有值都应该大于根结点root的值
 j=i
 while j<end:
 if arr[j]<root:
 return False
 j+=1
 left_IsAfterOrder=True
 right_IsAfterOrder=True
 #判断小于root值的序列是否是某一二元查找树的后续遍历
 if i>start:
 left_IsAfierOrder=IsAfterOrder(arr,start,i-1)
 #判断大于root值的序列是否是某一二元查找树的后续遍历
 if j<end:
 right_IsAfterOrder=IsAfterOrder(arr,i,end)
 return left_IsAfterOrder and right_IsAfterOrder
 
 if __name__="__main__":
 arr=[1,3,2,5,7,6,4]
 result=IsAfterOrder(arr,0,len(arr)-1)
 i=0
 while i<len(arr):
 print arr[i],
 i+-=1
 if result:
 print "是某一二元查找树的后续遍历序列"
 else:
 print "不是某一二元查找树的后续遍历序列"
 程序的运行结果为:
 1 3 2 5 7 6 4是某一二元查找树的后序遍历序列
 算法性能分析:

 这种方法对数组只进行了一次遍历,因此,时间复杂度O(N)。 

');