判断给定序列是否为BST后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。
目录
一、BST
1.1 定义
1.2 性质
二、思路
2.1 非递归版本
2.2 递归版本
一、BST
1.1 定义
BST(Binary Search Tree)二叉搜索树:
- 所有非叶子结点至多有两个孩子(二叉搜索树也属于二叉树的范畴);
- 所有结点只存储一个关键字;
- 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;并且左右子树也是BST。(如果出现等于的情况,放在左子树部分和放在右子树部分,不影响)。
1.2 性质
- 搜索时,从根结点开始,如果查询的关键字与根结点的关键字相等,那么就命中;如果查询的关键字比结点关键字小,就进入左子树部分进行查找;否则就需要进入右子树部分进行查找。查找到最后也没能找到,则报告找不到相应的关键字。
- 如果BST的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么BST的搜索性能逼近二分查找,近似等于树高(logn);但和连续空间的二分查找相比,优点是:改变BST结构(插入或删除操作)不需要移动大段的内存数据。
- 对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 递归版本
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);}
};
判断给定序列是否为BST后序遍历序列相关推荐
- 二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列
题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历: ...
- 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法
python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...
- 判断整数序列是不是二叉查找树的后序遍历结果
转自:http://blog.csdn.net/tianshuai11/article/details/7068755 判断整数序列是不是二叉查找树的后序遍历结果 题目:输入一个整数数组,判断该数组是 ...
- 【7-10 PAT】树的遍历(给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。)
题干: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 解题报告: dfs求出这棵树来,然后bfs求层序遍历就行了. AC代码: #include&l ...
- pta习题:给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。
5-6 树的遍历 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一 ...
- 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. #include <cstdio> #include <cstring> #i ...
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...
- 剑指offer——面试题24:二叉搜索树的后序遍历序列
剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...
- 剑指offer:面试题33. 二叉搜索树的后序遍历序列
题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜 ...
最新文章
- windows11图文安装流程
- JDK5.0新特性系列---11.4线程 Condition
- Oracle数据库索引失效,引起GoldenGate异常
- java term_[ElasticSearch]Java API 之 词条查询(Term Level Query)
- 用C#写 四舍五入函数(原理版)
- 【NC30】缺失的第一个正整数
- 机器学习算法分类总结
- c# 多个RadioButton与DataTable的数据绑定
- mysql创建表shop_ShopXO商城-支付方式 - 数据库设计 - 数据库表结构 - 果创云
- java什么是构造方法
- LOL暗影岛服务器维修,LOL各大区服务器的地点
- 在网页HTML中嵌入QQ、MSN、旺旺、Gtalk快速对话框代码
- 东方证券万字报告:微信视频号进入稳定的发展期
- 百度网盘mac损害计算机,Mac 电脑百度网盘一直闪退怎么办?解决办法
- ESP32基于arduino开发的心跳体温检测系统(四)本地端系统整合
- 「建议观看」史上超长,前端css晦涩难懂的点都在这啦
- 如何快速批量删除Excel单元格中的“换行符”
- 清末民初张家口地区服饰习俗变迁探研
- 2020华中科技大学计算机保研夏令营经验
- 论return 0的高级写法 bushi​​​​​​​)