关于序列的面试题1 ------------- 判断整数序列是否是二叉排序树的后续遍历
看了BAT大牛的hulu面经。觉得真正牛B的公司就是要招真正牛B的人。真正牛B的人必须是既聪明努力的人。既然是不是聪明自己决定不了, 那还是自己努力一点吧。而且感觉到一点,面试问到的算法题都是很短时间就能写出来的算法。所以如果一些算法题的代码量超过100行,就不用专门去准备了。
一面第1道面试题的题意是: 判断整数序列是不二叉排序树的后续遍历.
题目:输入一个整数组,判断该是不某二元查找树的后序遍历结果。
如果是返回 truet,否则返回 false 。
例如输入 5、7、6、9、11 、10 、8,由于这一整数序列是如下树的后遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回 true。
如果输入 7、4、6、5,没有哪棵树的后序遍历结果是这个列,因此返回 false。
这道题是july整理的微软面试100题当中的第9题。
解法如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 bool isSeq(int a[], int start, int end) 5 { 6 if(start == end) 7 return true; 8 if(start > end) 9 return false; 10 11 int root = a[end-1]; 12 int i = start; 13 while(i < end-1 && a[i] < root) 14 i++; 15 16 int postion = i; 17 while(i < end - 1) 18 { 19 if(a[i] < root) 20 return false; 21 i++; 22 } 23 bool left = isSeq(a, start, i); 24 bool right = isSeq(a, i, end-1); 25 26 return left&&right; 27 28 } 29 30 int main() 31 { 32 int a[7] = {5, 7, 6, 9, 11, 10, 8}; 33 int b[4] = {7, 4 ,6, 5}; 34 35 bool A = isSeq(a, 0, 7); 36 bool B = isSeq(b, 0, 4); 37 38 printf("A: %d B: %d\n", A, B); 39 return 0; 40 }
结果为: A: 1 B: 0 。
利用分治法来解决问题的时候, 划分区间通常为前闭后开,即为[start, i), [i, end)。 并且二分法的时间复杂度为O(nlgn)。
附加问题:如果空间复杂度允许为O(n), 这道题能否优化。
我想到的唯一优化方法,就是用栈来代替递归。但是时间复杂度是保持不变的。
解法如下:
1 bool isSeqNoRec(int a[], int start, int end) 2 { 3 int stack[100][2]; 4 if(start == end) 5 return true; 6 if(start > end) 7 return false; 8 int s, e, top = 0; 9 stack[top][0] = start; 10 stack[top][1] = end; 11 12 while(top > -1) 13 { 14 15 s = stack[top][0]; 16 e = stack[top][1]; 17 top--; 18 int root = a[e-1]; 19 int i = s; 20 while(i < e - 1 && a[i] < root) 21 i++; 22 23 int position = i; 24 while(i < e - 1) 25 { 26 if(a[i] < root) 27 return false; 28 i++; 29 } 30 if(position > s) 31 { 32 stack[++top][0] = s; 33 stack[top][1] = position; 34 } 35 36 if(position < e - 1) 37 { 38 stack[++top][0] = position; 39 stack[top][1] = e-1; 40 } 41 } 42 return true; 43 44 } 45 46 int main() 47 { 48 int a[7] = {5, 7, 6, 9, 11, 10, 8}; 49 int b[4] = {7, 4 ,6, 5}; 50 51 bool A = isSeqNoRec(a, 0, 7); 52 bool B = isSeqNoRec(b, 0, 4); 53 54 printf("A: %d B: %d\n", A, B); 55 56 system("pause"); 57 return 0; 58 }