題目:輸入一個整數數組,判斷該數組是否是某二元查找樹的後序遍歷的結果。數組
若是是返回 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; }