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

 

 

 

 

 

                   

你可能感兴趣的:(二叉排序树)