剑指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 - 二叉搜索树的后序遍历序列相关推荐

  1. 剑指offer(C++)-JZ33:二叉搜索树的后序遍历序列(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回 tru ...

  2. 【剑指Offer】23、二叉搜索树的后序遍历序列

      题目描述:   输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同.   解题思路:   对于后续遍历序列,序 ...

  3. 剑指Offer - 面试题33. 二叉搜索树的后序遍历序列(递归)

    1. 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜索树:5/ \2 6 ...

  4. 剑指offer面试题33. 二叉搜索树的后序遍历序列(二叉树)(递归)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 思路 详见链接 代码 class Sol ...

  5. 剑指offer(23)二叉搜索树的后序遍历序列

    前提:二叉搜索树的后续遍历由{左子数.右子树.根}组成,根的值小于右子树,大于左子树. 思路就是:后续遍历sequence,通过与根节点比较,找到左子树与右子树的分界点(i):如果如果分界点前面的数有 ...

  6. C#刷剑指Offer | 二叉搜索树的后序遍历序列

    [C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第289篇原创内容 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...

  7. 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

  8. 剑指offer——面试题24:二叉搜索树的后序遍历序列

    剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...

  9. 剑指offer之二叉搜索树的后序遍历序列

    剑指offer之二叉搜索树的后序遍历序列 欢迎关注作者博客 简书传送门 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个 ...

最新文章

  1. 在Powerpoint中插入Flash的方法
  2. Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解
  3. 开源 | App 开发神仙工具:帮你抓 Bug
  4. 不可求的电脑上必备软件,你也许听过
  5. 在unity中生成螺旋线的效果
  6. 支持xp的最高配置? 20210518
  7. 惠普服务器故障代码_hp常见错误代码
  8. PPT2010学习笔记(共20讲)
  9. 奇安信前三季营收31.9亿:同比增19% 扣非后净亏13.6亿
  10. 电脑或网页打开很慢是什么原因?
  11. c语言arg是什么函数,arg函数(arg辐角公式)
  12. 字符函数和字符串函数
  13. 285. 没有上司的舞会
  14. Android项目必备技术
  15. Android客户端与PC服务器如何实现Socket通信
  16. uniapp修改字体
  17. 运维同学,你们公司的运维团队有多少人?
  18. JAVA -生日礼物
  19. 2021年中式烹调师(中级)报名考试及中式烹调师(中级)考试总结
  20. 台式计算机蓝屏代码08e,Win8.1电脑开机出现蓝屏代码0x000008e如何解决

热门文章

  1. Mozilla考虑支持H.264
  2. 在东岸听刘元演奏萨克斯
  3. fedora在此处打开终端
  4. flutter刷新页面_用Flutter实现58App的首页
  5. python项目部署nginx_【python】Django web项目部署(Nginx+uwsgi)
  6. 删除 索引 外键 mysql_MySQL无法删除外键约束中所需的索引
  7. 计算机网络之-嵌入式学习
  8. CreateProcess
  9. C#判断一个类中有无指定名称的方法
  10. 【转】如何在编程生涯中有一个好的开端