题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
思路:后序遍历意味着数组最后一个元素一定是根。再根据binary search tree的特点,左子树一定比根小,右子树一定比根大来递归地检查左右子树。
代码:
#include <stdio.h> bool ispostorder(int* arr, int start, int end){ if(start>=end) return true; int i = start; while(i<end){ if(arr[i]>=arr[end]) break; i++; } bool l = (i==start)?true:ispostorder(arr,start,i-1); bool r = (i==end)?true:ispostorder(arr,i,end-1); if(l&&r){ int j; for(j=start;j<i;j++){ if(arr[j]>=arr[end]) return false; } for(j=i;j<end;j++){ if(arr[j]<=arr[end]) return false; } return true; }else{ return false; } } //更工整的方法。 int isPostorder(int* arr, int start, int end){ if(start>=end) return 1; int i =end-1; while(i>=start && arr[end]<arr[i]) i--; if(!isPostorder(arr,i+1,end-1)) return 0; int j=start; while(j<=i && arr[j]<arr[end]) j++; if(j!=i+1) return 0; return isPostorder(arr,start,j-1); } int main(){ int arr[]={5,7,6,9,11,10,8}; printf("%s\n",ispostorder(arr,0,6)?"Yes":"No"); printf("%s\n",isPostorder(arr,0,6)?"Yes":"No"); return 0; }
浙公网安备 33010602011771号