关于序列的面试题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题。
解法如下:
结果为: A: 1 B: 0 。
利用分治法来解决问题的时候, 划分区间通常为前闭后开,即为[start, i), [i, end)。 并且二分法的时间复杂度为O(nlgn)。
附加问题:如果空间复杂度允许为O(n), 这道题能否优化。
我想到的唯一优化方法,就是用栈来代替递归。但是时间复杂度是保持不变的。
解法如下:
一面第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; }
相关文章推荐
- 算法--判断一个数字序列是否为二叉排序树的后续遍历
- 判断一个序列是否时二叉排序树的后续遍历序列
- 判断一个序列是否为某二叉搜索树的后续遍历结果
- 【面试题】剑指offer24--判断一个序列是否为二叉树的后序遍历
- Solution 9: 判断序列是否为BST的后续遍历结果
- 剑指offer 面试题24 判断二叉搜索树后续遍历序列
- 判断整数序列是否为二元查找树后序遍历的结果
- 微软面试之9题 判断整数序列是不是二元查找树的后续遍历结果
- 判断整数序列是不是二元查找树的后续遍历结果
- 判断序列是否是二叉查找树的后续遍历结果
- 判断一个数组是否为二叉排序树的后续遍历
- 剑指offer24判断某一序列是否是某一搜索二叉树的后续遍历结果
- 判断整数序列是否为二元查找树的后序遍历结果的解决方法
- 【100题】第九题(整数序列是否是二叉查找树后续遍历)
- 判断整数序列是不是二元查找树的后续遍历
- 9.判断1个整数序列是不是二叉查找树的后续遍历结果
- 剑指offer:二叉搜索树的后序遍历序列(判断一个数组是否是二叉搜索树的后续遍历序列)
- 【华为面试题】给定一个数字(整数),判断它是否回文
- 每天一道算法题(5)——判断整数序列是否是二叉查找树后序遍历结果
- 建立有向图的邻接表,深度优先遍历和广度优先遍历的递归与非递归算法,判断是否是有向无环图,并输出一种拓扑序列