Interview----判断整数序列是否是二叉搜索树的后序遍历结果
2014-02-26 09:04
399 查看
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false。
思路:
抓住二叉搜索树的两个重要的性质:
1. 左子树所有节点的值 <= 当前节点 <= 右子树的所有节点的值
2. 左右子树都是一棵搜索树
关于二叉搜索树的详细分析可参考: /article/1336559.html
性质 1 对应于后序遍历就是: 后序遍历左边第一段的值 <= root <= 第二段的值。 root 就是最后一个节点。
性质 2 通过递归调用即可。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false。
思路:
抓住二叉搜索树的两个重要的性质:
1. 左子树所有节点的值 <= 当前节点 <= 右子树的所有节点的值
2. 左右子树都是一棵搜索树
关于二叉搜索树的详细分析可参考: /article/1336559.html
性质 1 对应于后序遍历就是: 后序遍历左边第一段的值 <= root <= 第二段的值。 root 就是最后一个节点。
性质 2 通过递归调用即可。
bool IsBST(vector<int>::iterator begin, vector<int>::iterator end) { if (end - begin < 3) return true; //左子树 小于当前节点,小于右子树 vector<int>::iterator left_end = begin; for(; *left_end <= *(end-1); ++ left_end); //use root as sentinel for(vector<int>::iterator it = left_end+1; it != end; ++it) if (*it < *(end-1)) return false; //left tree is a BST, and right tree as well if (IsBST(begin, left_end) && IsBST(left_end, end-1)) return true; else return false; }
相关文章推荐
- JNI 遇到的问题
- 如何调用GSL
- 开启华为手机Log Cat功能
- 线程同步之mutex和条件变量
- enum
- 有关线性代数的Matlab代码笔记(4)——生成矩阵,消元矩阵
- morning
- 9.4.5: 常见的架构设计策略---抛弃业务逻辑层
- 整数划分四
- 使用Visual Studio Profiler分析程序性能
- 六十三 C语言易错点
- 9.4.4: 常见的架构设计策略---合并业务逻辑对象与domain对象
- 用WinRAR解压7z.001格式的文件
- 电脑故障问题
- 自定义Translator add-in - 2
- vim配置文件
- 9.4.3: 常见的架构设计策略---合并业务逻辑对象和dao对象
- iOS--加载、滑动翻阅大量图片解决方案详解
- 遇到的一个面试题:编写一个strlen函数,不能使用全局变量或者局部变量
- 如何在VC中调用CLAPACK