您的位置:首页 > 职场人生

关于序列的面试题1 ------------- 判断整数序列是否是二叉排序树的后续遍历

2013-05-21 19:53 260 查看
看了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题。

解法如下:

#include <stdio.h>
#include <stdlib.h>

bool isSeq(int a[], int start, int end)
{
if(start == end)
return true;
if(start > end)
return false;

int root = a[end-1];
int i = start;
while(i < end-1 && a[i] < root)
i++;

int postion = i;
while(i < end - 1)
{
if(a[i] < root)
return false;
i++;
}
bool left = isSeq(a, start, i);
bool right = isSeq(a, i, end-1);

return left&&right;

}

int main()
{
int a[7] = {5, 7, 6, 9, 11, 10, 8};
int b[4] = {7, 4 ,6, 5};

bool A = isSeq(a, 0, 7);
bool B = isSeq(b, 0, 4);

printf("A: %d  B: %d\n", A, B);
return 0;
}


结果为: A: 1 B: 0 。

利用分治法来解决问题的时候, 划分区间通常为前闭后开,即为[start, i), [i, end)。 并且二分法的时间复杂度为O(nlgn)。

附加问题:如果空间复杂度允许为O(n), 这道题能否优化。

我想到的唯一优化方法,就是用栈来代替递归。但是时间复杂度是保持不变的。

解法如下:

bool isSeqNoRec(int a[], int start, int end)
{
int stack[100][2];
if(start == end)
return true;
if(start > end)
return false;
int s, e, top = 0;
stack[top][0] = start;
stack[top][1] = end;

while(top > -1)
{

s = stack[top][0];
e = stack[top][1];
top--;
int root = a[e-1];
int i = s;
while(i < e - 1 && a[i] < root)
i++;

int position = i;
while(i < e - 1)
{
if(a[i] < root)
return false;
i++;
}
if(position > s)
{
stack[++top][0] = s;
stack[top][1] = position;
}

if(position < e - 1)
{
stack[++top][0] = position;
stack[top][1] = e-1;
}
}
return true;

}

int main()
{
int a[7] = {5, 7, 6, 9, 11, 10, 8};
int b[4] = {7, 4 ,6, 5};

bool A = isSeqNoRec(a, 0, 7);
bool B = isSeqNoRec(b, 0, 4);

printf("A: %d  B: %d\n", A, B);

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐