【剑指offer】判断一个序列是否是二叉搜索树的后序遍历,C++实现
原创文章,转载请注明出处!
1.题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
举例:序列{5,7,6,9,11,10,8}是下图二叉搜索树的后序遍历结果。

2.思路
性质:
- 二叉排序树的性质:左子树上所有节点的值均小于它的根节点;右子树上所有节点的值均大于它的根节点。
- 二叉排序树后序遍历的性质:序列最后一个数字是根节点,序列剩余部分分成两部分,前一部分是左子树,后一部分是右子树。
举例:
- 判断序列{5,7,6,9,11,10,8}是否是二叉排序树的后序遍历。其中,8是根节点,{5,7,6}比8小是左子树,{9,11,10}比8大是右子树。
- 判断{5,7,6}是否是二叉排序树,其中6是根节点,5比6小是左子树,7比6大是右子树。
- 判断{9,11,10}是否是二叉排序树,其中10是根节点,9比10小是左子树,11比10大是右子树。
3.代码
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
return bst(sequence, 0, sequence.size() - 1);
}
private:
bool bst(vector<int> seq, int begin, int end){
// 边界条件
if(seq.empty() || begin > end)
return false;
// 划分左右子树,并判断左右子树和根节点的关系
int i = begin;
for(; i < end; ++i)
if(seq[i] > seq[end])
break;
int j = i;
for(; j < end; ++j)
if(seq[j] < seq[end])
return false;
// 判断左子树是不是二叉搜索树
bool left = true;
if(i > begin)
left = bst(seq, begin, i - 1);
// 判断右子树是不是二叉搜索树
bool right = true;
if(i < end - 1)
right = bst(seq, i , end - 1);
return left && right;
}
};
4.测试用例
- 空指针
- 后序遍历对应一颗BST二叉树
- 一个结点的BST二叉树
- 无左子树的BST二叉树
- 无右子树的BST二叉树
- 完全二叉树
- 后序遍历不对应一颗BST二叉树
【剑指offer】判断一个序列是否是二叉搜索树的后序遍历,C++实现的更多相关文章
- 剑指Offer22 判断数组是否为某二叉搜索树的后序遍历
/************************************************************************* > File Name: 22_Sequen ...
- (剑指Offer)面试题24:二叉搜索树的后序遍历序列
题目: 输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false. 假设输入的数组的任意两个数字都互不相同. 思路: 根据二叉搜索树的后序遍历特点,很 ...
- 【剑指offer】面试题24:二叉搜索树的后序遍历序列
题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 递归 注意,主要就是假定数组为空时结果为fa ...
- 《剑指offer》— JavaScript(23)二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 相关知识 二叉查找树(B ...
- 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)
二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路: ...
- 剑指offer23:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。输出Yes OR No。
1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 2 思路和方法 二叉搜索树:二叉查找树(Bin ...
- Interview----判断整数序列是否是二叉搜索树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: ...
- 剑指offer24:判断一个二叉树的后序遍历序列是否为二叉搜索树的后序遍历序列
public static boolean isBSTSequence(int[] s,int l, int r) { if (s == null || r <= 0) return false ...
- 【剑指offer】面试题24:二叉搜索树的兴许前序遍历序列
分析: 前序: 根 左 右 后序: 左 由 根 二叉搜索树: 左 < 根 < 右 那么这就非常明显了. def ifpost(postArray, start, end): #one or ...
随机推荐
- jackson序列化字段字母大小写及字段名重复
一:Jackson默认的属性发现规则将会查找到如下所述的属性: 1.所有被public修饰的字段(成员变量): 2.所有被public修饰的getter(即形如“getXxx()”的方法): 3.所有 ...
- An Overview of Forms Authentication (C#)
https://docs.microsoft.com/en-us/aspnet/web-forms/overview/older-versions-security/introduction/an-o ...
- Mysql CASE WHEN 用法
select sum(1) as col_0_0_, sum(case vciinfo.useable when -1 then 1 else 0 end) as col_1_0_, sum(case ...
- springMVC入门案例
1.配置文件的web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xs ...
- Vjudge - B - 这是测试你会不会排序
2017-07-14 22:44:11 writer:pprp 题目: 他们提出的比赛规则是这样的: 1. 每方派出n个人参赛: 2. 出赛的顺序必须是从弱到强(主要担心中国人擅长的田忌赛马): ...
- UVa 10883 超级平均数(二项式系数+对数计算)
https://vjudge.net/problem/UVA-10883 题意: 给出n个数,每相邻两个数求平均数,依次类推,最后得到1个数,求该数. 思路: 演算一下可以发现最后各个数的系数就是二项 ...
- LA 3971 组装电脑(二分)
https://vjudge.net/problem/UVALive-3971 题意:你有b块钱,想要组装一台电脑.给出n个配件各自的种类.品质因子和价格,要求每种类型的配件各买一个,总价格不超过b, ...
- centos 6 安装python2.7和pip
由于scrapy1.0的发布,想在Linux上测试,所以安装了centos6.6:但是它的python版本为2.6,很多东西都不支持,所以需要升级为2.7: 首先是在window7上安装虚拟机,然后安 ...
- 使用ASP.NET 的缓存机制的示例
if (HttpContext.Current.Cache["code_" + CodeType] == null) { SysCodeService codeService = ...
- html合并单元格
在合并的首位置加上colspan或者rowspan属性即可 code: <html> <body> <h4>横跨两列的单元格:</h4> < ...