关于序列的面试题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 } 

 

 

 

 

 

                   

posted on 2013-05-21 19:53  iamccme  阅读(655)  评论(0编辑  收藏  举报

导航