输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。

目录

一、BST

1.1 定义

1.2 性质

二、思路

2.1 非递归版本

2.2 递归版本


一、BST

1.1 定义

BST(Binary Search Tree)二叉搜索树:

  1. 所有非叶子结点至多有两个孩子(二叉搜索树也属于二叉树的范畴);
  2. 所有结点只存储一个关键字;
  3. 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;并且左右子树也是BST。(如果出现等于的情况,放在左子树部分和放在右子树部分,不影响)。

1.2 性质

  1. 搜索时,从根结点开始,如果查询的关键字与根结点的关键字相等,那么就命中;如果查询的关键字比结点关键字小,就进入左子树部分进行查找;否则就需要进入右子树部分进行查找。查找到最后也没能找到,则报告找不到相应的关键字。
  2. 如果BST的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么BST的搜索性能逼近二分查找,近似等于树高(logn);但和连续空间的二分查找相比,优点是:改变BST结构(插入或删除操作)不需要移动大段的内存数据。
  3. 对BST树进行中序遍历,将会得到非递减的序列。

图1 常规BST示意图

二、思路

后序遍历BST得到的序列的性质是——最后一个元素x是根结点,以x为基准可将该序列(去掉x本身)划分成两个子序列,前一个子序列(左子树)所有元素值均小于x;后一个子序列(右子树)的所有元素值均大于x。前一个序列和后一个序列仍然满足该性质。这是一个典型的递归求解的问题!

分治法思想:字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题······直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

2.1 非递归版本

class Solution {
public:bool VerifySquenceOfBST(vector<int> sequence) {int n = sequence.size();int i = -1;while(n > 1)    //只有1个结点的树也是BST。{ //第一个循环体结束时,i指向右子树序列开始位置;如果不存在右子树——会指向根结点。while(sequence[++i] < sequence[n-1]);  //警惕数组下标越界,第二个循环体正常结束,i将指向根结点的位置while(i < n-1 && sequence[i++] > sequence[n-1]);if(i < n-1) return false;i = 0;n--;}return n == 0 ? false : true;}
};

图2 非递归版本牛客网运行结果

2.2 递归版本

class Solution {
public:bool VerifySquenceOfBST(vector<int> sequence) {int n = sequence.size();if(0 == n) return false;return judge_impl(sequence, 0, n-1);}
private:bool judge_impl(vector<int>& seq, int start, int end){//start为序列的起始下标,end为序列中根结点的下标(最后一个元素)if(start >= end) return true;    //只有一个结点的序列肯定符合条件int i = start-1, j;while(seq[++i] < seq[end]);    //循环结束时i指向元素值不小于最后一个元素的位置for(j = i; j < end-1 && seq[j] > seq[end]; ++j);if(j < end-1) return false;return judge_impl(seq, start, i-1) && judge_impl(seq, i, end-1);}
};

图3 递归版本牛客网运行结果

判断给定序列是否为BST后序遍历序列相关推荐

  1. 二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列

    题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历: ...

  2. 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法

    python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...

  3. 判断整数序列是不是二叉查找树的后序遍历结果

    转自:http://blog.csdn.net/tianshuai11/article/details/7068755 判断整数序列是不是二叉查找树的后序遍历结果 题目:输入一个整数数组,判断该数组是 ...

  4. 【7-10 PAT】树的遍历(给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。)

    题干: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 解题报告: dfs求出这棵树来,然后bfs求层序遍历就行了. AC代码: #include&l ...

  5. pta习题:给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。

    5-6 树的遍历 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一 ...

  6. 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. #include <cstdio> #include <cstring> #i ...

  7. 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列

    剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...

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

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

  9. 剑指offer:面试题33. 二叉搜索树的后序遍历序列

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

最新文章

  1. windows11图文安装流程
  2. JDK5.0新特性系列---11.4线程 Condition
  3. Oracle数据库索引失效,引起GoldenGate异常
  4. java term_[ElasticSearch]Java API 之 词条查询(Term Level Query)
  5. 用C#写 四舍五入函数(原理版)
  6. 【NC30】缺失的第一个正整数
  7. 机器学习算法分类总结
  8. c# 多个RadioButton与DataTable的数据绑定
  9. mysql创建表shop_ShopXO商城-支付方式 - 数据库设计 - 数据库表结构 - 果创云
  10. java什么是构造方法
  11. LOL暗影岛服务器维修,LOL各大区服务器的地点
  12. 在网页HTML中嵌入QQ、MSN、旺旺、Gtalk快速对话框代码
  13. 东方证券万字报告:微信视频号进入稳定的发展期
  14. 百度网盘mac损害计算机,Mac 电脑百度网盘一直闪退怎么办?解决办法
  15. ESP32基于arduino开发的心跳体温检测系统(四)本地端系统整合
  16. 「建议观看」史上超长,前端css晦涩难懂的点都在这啦
  17. 如何快速批量删除Excel单元格中的“换行符”
  18. 清末民初张家口地区服饰习俗变迁探研
  19. 2020华中科技大学计算机保研夏令营经验
  20. 论return 0的高级写法 bushi​​​​​​​)

热门文章

  1. OBJECT ARX 移动,拷贝 旋转,镜像,缩放
  2. video使用,以及解决:网页刷新后,video视频无法播放
  3. 2023年中山大学法律硕士(非法学)考研上岸前辈备考经验
  4. 【XJB研究】关于最短路径数
  5. pgdac和unidac插入效率究竟差多少?
  6. http抓包分析技巧总结
  7. 手把手带你完成数据库课程设计(餐饮管理系统)
  8. 一牛网:Android camera驱动培训班,不可错过的学习机会
  9. Redis-- 缓存预热+缓存雪崩+缓存击穿+缓存穿透
  10. c语言父亲节快乐,老爸  父亲节快乐