题目:

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

分析:

二叉树的后序遍历也就是先访问左子树,再访问右子树,最后访问根节点,所以不难发现,所给的数组最后一个元素一定是二叉搜索树的根节点,而如果数组是二叉搜索树的后续遍历的话,就一定会根据数值划分两部分,左边是根节点的左子树,剩下的部分则是根节点的右子树。左子树的数值均小于根节点,右子树的数值均大于根节点。

例如{5,7,6,9,11,10,8},8是二叉搜索树的根节点,{5,7,6}是左子树,{9,11,10}是右子树。再递归判断。

6是根节点,5是左子树,7是右子树,由于只剩一个元素了,判断中止,同理{9,11,10}也是如此。

但如果不是后序遍历的序列,如{7,4,6,5}

5是根节点,7,4,6三个元素没有办法划分出左右子树,因为二叉搜索树的特性我们知道,左子树所有元素的值都小于根节点,右子树的值均大于根节点,无论是{7},{4,6}还是{7,4},{6}均不符合二叉搜索树的性质,在编程实现的过程中,我们可以遍历数组,当出现第一个大于根节点的元素时,便认为之前的所有元素时这个根节点的左子树,而排除最后一个元素剩下的所有元素便是右子树,查看右子树中的元素如果有小于根节点的元素,便可以直接判断不是二叉搜索树的后续遍历,如果没有就递归执行下去。

程序:

C++

  1. class Solution {
  2. public:
  3. bool VerifySquenceOfBST(vector<int> sequence) {
  4. if(sequence.size() == ) return false;
  5. return helper(sequence, , sequence.size());
  6. }
  7. bool helper(vector<int> &v, int index, int length){
  8. if(length <= )
  9. return true;
  10. int i = ;
  11. for(; i < length-; ++i){
  12. if(v[index + i] > v[index + length -])
  13. break;
  14. }
  15. for(int j = i; j < length-; ++j){
  16. if(v[index + j] < v[index + length -])
  17. return false;
  18. }
  19. return helper(v, index, i) && helper(v, index+i, length-i-);
  20. }
  21. };

Java

  1. public class Solution {
  2. public boolean VerifySquenceOfBST(int [] sequence) {
  3. if(sequence.length == 0) return false;
  4. return helper(sequence, 0, sequence.length);
  5. }
  6. public boolean helper(int [] sequence, int index, int length){
  7. if(length <= 1)
  8. return true;
  9. //找到第一个大于根节点的元素偏移量,此元素右侧序列为右子树(包括)
  10. int i = 0;
  11. for(; i < length - 1; ++i){
  12. if(sequence[index + i] > sequence[index + length -1])
  13. break;
  14. }
  15. //检查右子树元素是否都大于根节点
  16. for(int j = i; j < length - 1; ++j){
  17. if(sequence[index + j] < sequence[index + length -1])
  18. return false;
  19. }
  20. return helper(sequence, index, i) && helper(sequence, index+i, length-i-1);
  21. }
  22. }

剑指Offer-23.二叉搜索树的后序遍历序列(C++/Java)的更多相关文章

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

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题目地址 https://www.nowcoder ...

  2. [剑指offer] 23. 二叉搜索树的后序遍历序列

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

  3. 《剑指offer》二叉搜索树的后序遍历序列

    本题来自<剑指offer> 二叉搜索树的后序遍历序列 题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字 ...

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

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

  5. 剑指 Offer 33. 二叉搜索树的后序遍历序列 + 根据二叉树的后序遍历序列判断对应的二叉树是否存在

    剑指 Offer 33. 二叉搜索树的后序遍历序列 Offer_33 题目详情 题解分析 本题需要注意的是,这是基于一颗二叉排序树的题目,根据排序二叉树的定义,中序遍历序列就是数据从小到大的排序序列. ...

  6. 剑指 Offer 33. 二叉搜索树的后序遍历序列

    剑指 Offer 33. 二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. ...

  7. 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)

    [剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...

  8. 【剑指offer】二叉搜索树的后序遍历序列

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26092725 剑指offer上的第24题,主要考察递归思想,九度OJ上AC. 题目描写叙述 ...

  9. 【Java】 剑指offer(33) 二叉搜索树的后序遍历序列

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如 ...

  10. Go语言实现:【剑指offer】二叉搜索树的后序遍历序列

    该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. Go ...

随机推荐

  1. java学习6-java基础类库

    1.与用户互动 2.系统相关 3.常用类 4.日期.时间类

  2. 关于托福改革后的难度、评分和拼分,听听ETS的老师怎么说

    “笔者有幸于几天前去到ETS位于普林斯顿的总部学习,聆听了他们关于托福考试的发展和变革的说明,在这里向大家汇报一下此行的收获.” 当从车上下来那一刻起,我们便被那辽阔的绿草地和宜人的风景所吸引,伴随着 ...

  3. 使用 statcounter 统计 Hexo 博客访问量

    介绍 statcounter是一个提供网站访问统计服务的网站: StatCounter is a simple but powerful real-time web analytics service ...

  4. 史上最轻松入门之Spring Batch - 轻量级批处理框架实践

    从 MariaDB 一张表内读 10 万条记录,经处理后写到 MongoDB . Batch 任务模型 具体实现 1.新建 Spring Boot 应用,依赖如下: <!-- Web 应用 -- ...

  5. 【MongoDB详细使用教程】五、MongoDB的数据库管理

    目录 1.数据库安全 1.1.创建管理员账号和密码 1.2.设置服务状态为需要验证用户 1.3.创建用户账户和密码 1.4.忘记密码/修改密码 2.主从服务器 2.1.创建服务器目录,用于分别存放主从 ...

  6. RabbitMQ通过DLX实现消息延迟接收

    1. 创建队列WorkQueue,并把WorkQueue跟exchangeWork绑定:2. 创建队列DLXQueue,并把DLXQueue跟exchangeDLX绑定:a. 设置DLXQueue队列 ...

  7. 微信公众号 访问403问题,样式错乱,js失效

    我服了,还是那个微信公众号小项目. 这个项目用的是ssm+velocity 问题的是,有时候页面加载会乱,js,css都加载不出来. 这个问题也是很久了,前几天开会,那个甲方医院很不开心,说是要找下家 ...

  8. beanfactory中单例bean的初始化过程(一)

    Date 10.06 pm Point 完成beanfactory中单例bean的初始化 beanFactory.preInstantiateSingletons() 拿到所有的bean定义信息(在 ...

  9. fenby C语言 P19

    #include <stdio.h> int main(){ int i,j; for(i=1;i<=8;i++) { for(j=1;j<=i;j++) { printf(& ...

  10. docker安装sshd

    基础镜像: ubuntu:14.04 启动并安装sshd //启动 docker run -it ubuntu:14.04 /bin/bash //更新apt-get apt-get update / ...