①题目

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

②思路

1、后续遍历的数组里,最后一个元素是根。

2、在BST里,左子树每个元素<根<右子树每个元素

3、从第0位开始,找到第一个>根节点的元素,记录此位置i。在此位置之前都属于左子树(此时已经断定左子树都小于根节点)

4、检查右子树是否都大于跟节点(从第i位开始,到根节点前)

5、递归判断左右子树是否都属于BST,也即重复3-4步;

③代码

 public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
boolean[] res = new boolean[1];
res[0] = true;
if(sequence.length==0) //如果输入为空,那么直接返回false
return false;
isBST(0,sequence.length-1,res,sequence); //调用函数,在函数里根据各种判断条件来改动res[0]
return res[0];
} public int isBST(int start,int end,boolean[] res,int[] sequence){
if(start>=end) //1种退出条件
return start;
int mid = (start+end)>>>1; //除以2
int curr_root = sequence[end];
int i=start; //这一步不能写在for循环里面,否则会在第21行报错说不认识i
for(;i< end;i++){
if(sequence[i]>curr_root)
break; //一旦找到第一个>根的元素,立刻break出去
}
for(int j=i;j< end;j++){
if(sequence[j]<curr_root){
res[0]=false; //改变res[0]的值
return start; //isBST这个函数只是为了改动res[0]的值,所以随便返回个什么东西就行了,比如我返回个start
}
}
isBST(start,mid-1,res,sequence); //递归判断左子树,
isBST(mid,end-1,res,sequence); //递归判断右子树
return start;
}
}

④学到的东西

1、做了Leeccode的108题,于是把>>>的写法学来了,用在了本题第14行。

2、一定要学会怎么用后序遍历数组来判断是不是BST,也就是本题第②点的分析过程;

3、使用res[0]标志位,并且用整个isBST函数来改变res[0]的值,以至于isBST这个函数的返回值返回什么都不重要了,这种方法我是从《程序员代码面试指南:IT名企算法与数据结构题目最优解》的145页学来的。

[剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)的更多相关文章

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

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同.   思路: 后续遍历数组的尾部为根节点,前面的部分 ...

  2. 剑指Offer——二叉搜索树的后序遍历序列

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search ...

  3. 用js刷剑指offer(二叉搜索树的后序遍历序列)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 牛客网链接 js代码 function Verif ...

  4. 剑指offer--30.二叉搜索树的后序遍历序列

    正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...

  5. 剑指Offer-23.二叉搜索树的后序遍历序列(C++/Java)

    题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉树的后序遍历也就是先访问左子树,再访问右 ...

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

    自己写的更简洁的代码 class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { int length ...

  7. 剑指offer 二叉搜索树与双向链表

    html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...

  8. 剑指Offer——二叉搜索树与双向链表

    题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 二叉搜索树,中序遍历就是排序的. 所以我们利用中序遍历,将前后两 ...

  9. 剑指offer 二叉搜索树和双向链表

    剑指offer 牛客网 二叉搜索树和双向链表 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 18:58:36 2019 ...

随机推荐

  1. 爬虫3:html页面+webdriver模块+demo

    保密性好的网站,不能使用request请求页面信息,这样可以使用webdriver模块先开启一个浏览器,然后爬去信息,甚至还可以click等操作对页面操作,再爬取. demo 一般流程: 1)包含se ...

  2. PHP compact

    1.函数的作用:将变量转成数组 2.函数的参数: @params string $varname1 @params string $varname2 ... @params array $varnam ...

  3. linux下mqtt-client

    CPATH += ../embe_mqtt/MQTTClient/srcPSRTPATH = ../embe_mqtt/MQTTPacket/src LOADPATH += -I$(CPATH)LOA ...

  4. 概念理解:boost::asio::io_service

    IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...

  5. Vuex使用总结

    Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex的五个核心概念 ...

  6. Spring Boot Security And JSON Web Token

    Spring Boot Security And JSON Web Token 说明 流程说明 何时生成和使用jwt,其实我们主要是token更有意义并携带一些信息 https://github.co ...

  7. Redis(十四)Redis 在Java Web 中的应用

    在传统的 Java Web 项目中,使用数据库进行存储数据,但是有一些致命的弊端,这些弊端主要来自于性能方面. 由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,在一般管理系统中,由于不存在高 ...

  8. Andriod开发环境搭建

    一.相关安装文件准备

  9. fenby C语言

    P1框架 1#include <stdio.h> 2 3int main(){ 4    printf(“C语言我来了”); 5    return 0; 6} P2main()门 P3计 ...

  10. 小白 Python 爬虫部署 Linux

    前言 前面国庆节的时候写过一个简易的爬虫. <Python 简易爬虫实战> 还没看过的同学可以先看一下,这只爬虫主要用来爬取各个博客平台的阅读量等数据,一直以来都是每天晚上我自己手动在本地 ...