剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16
- 题目描述:
-
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入:
-
每个测试案例包括2行:
第一行为1个整数n(1<=n<=10000),表示数组的长度。
第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。
- 输出:
-
对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出No。
- 样例输入:
-
7 5 7 6 9 11 10 8 4 7 4 6 5
- 样例输出:
-
Yes No
题意分析: 题目要求给定一个数组,判断此数组能不能是一颗BST的后序遍历。对于后序遍历,最后一个元素对应根节点,前一段元素小于根节点,后一段元素大于根节点。 对于数组a[n],如果存在1<=k<=n,使得a[1]~a[k - 1]均小于a[n],a[k]~a[n - 1]均大于a[n],则可以划分出两个子树,两个子树可以为空。 按照这种划分标准递归往下检查所有子树,全部符合的话,说明能够造出一个二叉搜索树。否则不符合二叉搜索树的结构。 所有节点遍历一次,有O(n)时间开销,但因为找出划分左右子树的节点a[k]需要O(n)的开销,所以实际是O(nlog n),推导如下: T(n) = 2 * T(n / 2) + O(1) + O(n) T(n) = 2 * T(n / 2) + O(n) T(n) = 4 * T(n / 4) + 2 * (O(n / 2)) + O(n) T(n) = 4 * T(n / 4) + 2 * O(n) T(n) = 2 ^ log(n) * T(1) + log(n) * O(n) T(n) = O(n) + O(n * log(n)) T(n) = O(n * log(n)) 空间复杂度O(1),不需要额外数组。
1 // 652939 zhuli19901106 1367 Accepted 点击此处查看所有case的执行结果 1020KB 1192B 10MS 2 // 201311172259 3 #include <cstdio> 4 using namespace std; 5 6 bool check_postorder(const int a[], int left, int right) 7 { 8 if(a == NULL || left < 0 || right < 0 || left > right){ 9 return false; 10 } 11 12 if(left == right){ 13 return true; 14 } 15 16 int i; 17 18 i = left; 19 while(i <= right - 1 && a[i] < a[right]){ 20 ++i; 21 } 22 if(i == right){ 23 // right substree is empty 24 return check_postorder(a, left, right - 1); 25 }else if(i == left){ 26 // left substree is empty 27 for(; i <= right - 1; ++i){ 28 if(a[i] < a[right]){ 29 return false; 30 } 31 } 32 return check_postorder(a, left, right - 1); 33 }else{ 34 int pos = i; 35 for(; i <= right - 1; ++i){ 36 if(a[i] < a[right]){ 37 return false; 38 } 39 } 40 return check_postorder(a, left, pos - 1) && check_postorder(a, pos, right - 1); 41 } 42 } 43 44 int main() 45 { 46 const int MAXN = 10005; 47 int a[MAXN]; 48 int n, i; 49 50 while(scanf("%d", &n) == 1){ 51 for(i = 0; i < n; ++i){ 52 scanf("%d", &a[i]); 53 } 54 if(check_postorder(a, 0, n - 1)){ 55 printf("Yes\n"); 56 }else{ 57 printf("No\n"); 58 } 59 } 60 61 return 0; 62 }
转载于:https://www.cnblogs.com/zhuli19901106/p/3438577.html
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列相关推荐
- 剑指offer(C++)-JZ33:二叉搜索树的后序遍历序列(数据结构-树)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回 tru ...
- 【剑指Offer】23、二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路: 对于后续遍历序列,序 ...
- 剑指Offer - 面试题33. 二叉搜索树的后序遍历序列(递归)
1. 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜索树:5/ \2 6 ...
- 剑指offer面试题33. 二叉搜索树的后序遍历序列(二叉树)(递归)
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 思路 详见链接 代码 class Sol ...
- 剑指offer(23)二叉搜索树的后序遍历序列
前提:二叉搜索树的后续遍历由{左子数.右子树.根}组成,根的值小于右子树,大于左子树. 思路就是:后续遍历sequence,通过与根节点比较,找到左子树与右子树的分界点(i):如果如果分界点前面的数有 ...
- C#刷剑指Offer | 二叉搜索树的后序遍历序列
[C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第289篇原创内容 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...
- 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列
[LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...
- 剑指offer——面试题24:二叉搜索树的后序遍历序列
剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...
- 剑指offer之二叉搜索树的后序遍历序列
剑指offer之二叉搜索树的后序遍历序列 欢迎关注作者博客 简书传送门 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个 ...
最新文章
- 在Powerpoint中插入Flash的方法
- Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解
- 开源 | App 开发神仙工具:帮你抓 Bug
- 不可求的电脑上必备软件,你也许听过
- 在unity中生成螺旋线的效果
- 支持xp的最高配置? 20210518
- 惠普服务器故障代码_hp常见错误代码
- PPT2010学习笔记(共20讲)
- 奇安信前三季营收31.9亿:同比增19% 扣非后净亏13.6亿
- 电脑或网页打开很慢是什么原因?
- c语言arg是什么函数,arg函数(arg辐角公式)
- 字符函数和字符串函数
- 285. 没有上司的舞会
- Android项目必备技术
- Android客户端与PC服务器如何实现Socket通信
- uniapp修改字体
- 运维同学,你们公司的运维团队有多少人?
- JAVA -生日礼物
- 2021年中式烹调师(中级)报名考试及中式烹调师(中级)考试总结
- 台式计算机蓝屏代码08e,Win8.1电脑开机出现蓝屏代码0x000008e如何解决