剑指offer23:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。输出Yes OR No。
1 题目描述
2 思路和方法
二叉搜索树:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
递归求解:
(1)从第0位开始,找到第一位比根节点大的元素,记录此位置i。在此位置之前都属于左子树(此时已经断定左子树都小于根节点)
(2)检查右子树是否都大于跟节点(从第i位开始,到根节点前)
(3)判断左右子树是否都属于二叉搜索树。
二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低,为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、multiset、关联数组等。
非递归求解:
6
/ \
3 8
/ \ / \
2 5 7 9
2 5 3 7 9 8 6
左子树一定比右子树小,因此去掉根结点后,数字分为left,right两部分,right部分的最后一个数字是右子树的根,且它比左子树所有结点的值大,因此我们可以每次只看有子树是否符合条件即可,即使到达了左子树,左子树也可以看出由左右子树组成的树还像右子树那样处理.
3 C++核心代码
3.1 递归求解
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {} //判断某数组是不是二叉搜索树的后序遍历序列
if(sequence.empty())
return false;
int index;
int begin = ;
int end = sequence.size()-;
int root = sequence[end];
for(index = begin;index<end;index++) //左子结点小于根节点
if(sequence[index]>root)
break;
for(int j = index;index<end;index++) //右子结点大于根结点
if(sequence[index]<root)
return false;
bool left = true;
vector<int> left_sq(sequence.begin(),sequence.begin()+index);
if(index>begin)
left = VerifySquenceOfBST(left_sq); //判断左子树是不是二叉搜索树
bool right = true;
vector<int> right_sq(sequence.begin()+index+,sequence.end());
if(index<end-)
right = VerifySquenceOfBST(right_sq); //判断右子树是不是二叉搜索树
return left&&right;
}
};
3.2 非递归求解
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) { //判断某数组是不是二叉搜索树的后序遍历序列
int backIdx = sequence.size();
if(backIdx==) return false;
int forIdx = ;
while(--backIdx) // backIdx=1时退出循环
{
while(sequence[forIdx]<sequence[backIdx]) forIdx++; // forIdx从前往后扫描left部分
while(sequence[forIdx]>sequence[backIdx]) forIdx++; // forIdx从前往后继续扫描,主要扫right部分
if(forIdx<backIdx) return false; // 如果原序列是二叉搜索树BST的后序遍历序列,则终止时forIdx=backIdx
forIdx=; // 将forIdx拉回序列起点继续扫
}
return true;
}
};
4 C++完整代码
#include<cstdio>
#include<vector> using namespace std; class Solution{
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
int len = sequence.size();
if (len <= )
return false;
vector<int> left, right;
int root = sequence[len - ];
int i = ;
while (i<len - ) // 处理left部分
{
if (sequence[i]>root)
break;
left.push_back(sequence[i]);
i++;
}
int j = i; // 处理right部分,此时i为left部分最后一个结点的下标
while (j<len - )
{
if (sequence[j]<root)
return false;
right.push_back(sequence[j]);
j++;
}
bool bleft = true; // 应初始化为true,left部分是BST序列,才能调用VerifySquenceOfBST()
if (i != )
bleft = VerifySquenceOfBST(left); // i为left部分最后一个结点的下标 ,i!=0表示有左子树
bool bright = true;
if (i != len - )
bright = VerifySquenceOfBST(right); // i!= len-1表示有右子树
return (bleft && bright);
}
};
// 以下为测试部分
int main()
{
Solution sol;
vector<int> vec1 = { , , , , , , };
vector<int> vec2 = { , , , , , , };
vector<int> vec3 = { , , , };
bool res1 = sol.VerifySquenceOfBST(vec1);
bool res2 = sol.VerifySquenceOfBST(vec2);
bool res3 = sol.VerifySquenceOfBST(vec3); printf("%d\n", res1);
printf("%d\n", res2);
printf("%d\n", res3); system("pause");
return ;
}
参考资料
https://blog.csdn.net/cdatreides/article/details/81701523
https://blog.csdn.net/lzuacm/article/details/51317617
剑指offer23:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。输出Yes OR No。的更多相关文章
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...
- 【剑指Offer面试编程题】题目1367:二叉搜索树的后序遍历序列--九度OJ
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...
- 【剑指offer】二叉搜索树的后序遍历序列
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26092725 剑指offer上的第24题,主要考察递归思想,九度OJ上AC. 题目描写叙述 ...
- 剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...
- 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)
二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路: ...
- 【剑指offer】判断一个序列是否是二叉搜索树的后序遍历,C++实现
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出N ...
- [剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)
①题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ②思路 1.后续遍历的数组里,最后一个元素是根. 2 ...
- 剑指Offer22 判断数组是否为某二叉搜索树的后序遍历
/************************************************************************* > File Name: 22_Sequen ...
- 剑指 Offer 33. 二叉搜索树的后序遍历序列 + 根据二叉树的后序遍历序列判断对应的二叉树是否存在
剑指 Offer 33. 二叉搜索树的后序遍历序列 Offer_33 题目详情 题解分析 本题需要注意的是,这是基于一颗二叉排序树的题目,根据排序二叉树的定义,中序遍历序列就是数据从小到大的排序序列. ...
随机推荐
- Python学习日记(七)——装饰器
1.必备知识 #### 一 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 二 #### def foo(): print ' ...
- springboot+mybatis+druid+sqlite/mysql/oracle
搭建springboot+mybatis+druid+sqlite/mysql/oracle附带测试 1.版本 springboot2.1.6 jdk1.8 2.最简springboot环境 http ...
- DSSM算法-计算文本相似度
转载请注明出处: http://blog.csdn.net/u013074302/article/details/76422551 导语 在NLP领域,语义相似度的计算一直是个难题:搜索场景下quer ...
- Cesium中级教程6 - 3D Models 三维模型
3D Models 三维模型 本教程将教您如何通过Primitive API转换.加载和使用Cesium中的三维模型.如果你是Cesium的新用户,可能需要阅读三维模型部分的(空间数据可视化教程)[h ...
- oracle启动过程2
5个目标点(知识点)环境说明,连接实例,hash运算dbs目录文件解释参数文件解释启动过程三阶段实战演练 本次课程目标是讲解oracle实例的启动过程首先了解一下本次实验环境 之前已经创建好了一 ...
- CSS3常用属性及效果汇总
本文转载于<https://blog.csdn.net/lyznice/article/details/54575905> 一.2D效果属性 要使用这些属性,我们需要通过 transfor ...
- C++ ++pos vs pos++
list<char>::iterator pos; 一般使用前置式递增(preincrement),因为它比后置式递增(postincrement)效率高,因为后置式递增内部需要一个临时对 ...
- c# 线程异步处理
public class AsyncHelper { private static readonly TaskFactory _myTaskFactory = new TaskFactory(Canc ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_24-CMS前端页面查询开发-使用钩子方法实现立即查询
进入页面默认就去查询数据 这要用到vue的钩子函数,每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听. 编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等. ...
- JAVA 基础编程练习题43 【程序 43 求奇数个数】
43 [程序 43 求奇数个数] 题目:求 0—7 所能组成的奇数个数. package cskaoyan; public class cskaoyan43 { @org.junit.Test pub ...