题目:输入一个整数数组,判断该数组是否是某二元查找树的后序遍历的结果。数组
若是是返回 true,不然返回 false。spa
例如输入 五、七、六、九、十一、十、8,因为这一整数序列是以下树的后序遍历结果:code
8递归
/ \io
6 10编译
/ \ / \class
5 7 9 11遍历
所以返回 true。总结
若是输入 七、四、六、5,没有哪棵树的后序遍历的结果是这个序列,所以返回 false。di
思路:
二叉查找的特征:左子树的各个值均小于根,右子树的各个值均大于跟
后序遍历的特征:最后一个是根,便利顺序,左右跟。递归
好了,总结能够获得:
最后一个是根,最开始连续若干个数小于根的是左子树的节点,以后连续若干个大于根的是右子树的节点(左右子树均可能为空),而后递归描述。
代码描述以下(GCC编译经过):
#include "stdio.h" #include "stdlib.h" int isPostorderResult(int a[],int n); int helper(int a[],int s,int e); int main(void) { int a[7] = {5,7,6,9,11,10,8}; int b[4] = {7,4,6,5}; int tmp; tmp = isPostorderResult(a,7); printf("%d",tmp); return 0; } int isPostorderResult(int a[],int n) { return helper(a,0,n-1); } int helper(int a[],int s,int e) { int i,j,root; if(s == e) return 1; for(i=0;i<e && a[i]<a[e];i++); if(i != 0 && helper(a,s,i-1) == 0) return 0; for(j=i;j<e && a[j]>a[e];j++); if(j==e && helper(a,i,j-1) == 1) return 1; else return 0; }