描述

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

数据范围: 节点数量 0≤n≤1000 ,节点上的值满足  1≤val≤10^5 ,保证节点上的值各不相同
要求:空间复杂度 O(n) ,时间时间复杂度 O(n^2)

提示:

1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。

2.该题我们约定空树不是二叉搜索树

3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历

4.参考下面的二叉搜索树,示例 1

示例1

输入:

[1,3,2]

返回值:

true

说明:

是上图的后序遍历 ,返回true        

示例2

输入:

[3,1,2]

返回值:

false

说明:

不属于上图的后序遍历,从另外的二叉搜索树也不能后序遍历出该序列 ,因为最后的2一定是根节点,前面一定是孩子节点,可能是左孩子,右孩子,根节点,也可能是全左孩子,根节点,也可能是全右孩子,根节点,但是[3,1,2]的组合都不能满足这些情况,故返回false   

示例3

输入:

[5,7,6,9,11,10,8]

返回值:

true

初看此题 没有什么好思路 只有暴力:
     根据 后序+中序=》还原BST
     再对BST进行后续遍历 与输入的后续比较 若一致 返回true  否则返回false

后续数组:int[] post;  中序数组:int[] vin;
结果写着写着发现,当不是BST的后序序列时会抛数组越界异常,也就是vin中找不到post最后一个元素(应该是根)
这时有了启发,一旦出现vin中找不到根,说明肯定不是BST,此时就可以得到最终结果了!!

我的代码:

import java.util.Arrays;
public class Solution {boolean flag=true;public boolean VerifySquenceOfBST(int [] sequence) {if(sequence.length==0) return false;int [] vin =Arrays.copyOf(sequence,sequence.length);Arrays.sort(vin);reConstructBinaryTree(sequence,vin);//出一次错就flag==falsereturn flag;}//能还原就是 不能还原就不是public void reConstructBinaryTree(int [] post,int [] vin) {if(post.length==0||flag==false) return;TreeNode root=new TreeNode(post[post.length-1]);//后序最后一个是根int k=0;for(k=0;k<vin.length&&vin[k]!=post[post.length-1];k++);if(k==vin.length) {flag=false; return;}//找不到,数组越界了 直接得到false结果if(k>0) reConstructBinaryTree(Arrays.copyOfRange(post,0,k),Arrays.copyOfRange(vin,0,k));//递归创建左右子树if(post.length-k-1>0) reConstructBinaryTree(Arrays.copyOfRange(post,k,post.length-1),Arrays.copyOfRange(vin,k+1,vin.length));}
}

换种思路,抛却还原二叉树的想法,二分找矛盾

待做.....

方法二:栈

二叉树的中序遍历和后序遍历对应着一种栈的压入、弹出序列 

中序看做是一种入栈序列   则后序必然是其中一种出栈序列

后期 结合 JZ31题一起做吧

O(n^2的话就好做了  升序入栈 则后面比我小的一定严格降序 很好找矛盾)

JZ33 二叉搜索树的后序遍历序列 (未完结合JZ31)相关推荐

  1. 剑指offer:面试题33. 二叉搜索树的后序遍历序列

    题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜 ...

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

    二叉搜索树的后序遍历序列 P157 题目:输入一个数组,判断这个数组是不是一个二叉搜索树的后序遍历的结果. solution:我们知道后序遍历序列的最后一个item是根节点,如果确实是二叉搜索树的后序 ...

  3. 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列

    剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...

  4. C#刷剑指Offer | 二叉搜索树的后序遍历序列

    [C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第289篇原创内容 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...

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

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

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

    二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 这里遇到的问题就是,传递的子数组怎 ...

  7. 剑指offer——面试题24:二叉搜索树的后序遍历序列

    剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...

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

    剑指offer之二叉搜索树的后序遍历序列 欢迎关注作者博客 简书传送门 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个 ...

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

    剑指 Offer 33. 二叉搜索树的后序遍历序列 原始题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian- ...

最新文章

  1. java.net.UnknownHostException: unknown host:xxxx异常解决办法
  2. 网站优化四大优势必须了解
  3. 【Excel技巧】如何批量去掉×××号前的单引号
  4. 1过程流程图 3 apqp_如何绘制流程图?这里有3种绘制方法,既简单又高效!1分钟可学会...
  5. [机器学习] 半监督学习---伪标签Pseudo-Label
  6. 跨站点脚本(XSS)
  7. 6大设计原则之单一职责原则
  8. MapReduce 工作原理
  9. 【聚会】2014圣诞北京版主聚餐-淘虾记“光辉岁月”版
  10. 清华大学操作系统OS学习(二)——OS基本概念
  11. php smarty安装,Smarty安装
  12. 如何开发网页3D游戏
  13. Windows与网络基础-15-本地安全策略
  14. 软件测试三分钟自我介绍
  15. 雅加达出差(8月24日到25日)
  16. [转]成功=狼+狐狸+豹子
  17. PatchMatch分析
  18. Decision tree(决策树)算法初探
  19. 你真的会选择前端培训班吗
  20. 美国签证DS-160填表指南(内含图文)

热门文章

  1. arm-linux东东之nand之2:3c2440_nand_probe
  2. 机器学习为什么重要_机器学习:它是如何工作的; 更重要的是,为什么它起作用?...
  3. php中 act什么意思,剑网三act是什么意思?详解丐帮act概念
  4. Kendo UI 刷新数据源信息
  5. poi设置excel行高
  6. 2008 r2 server sql 中文版补丁_Microsoft SQL Server 2008 R2 SP1补丁 32位 官方免费版(附安装教程)...
  7. 键盘侠Linux教程(一)| 初学者建议
  8. 分类——LDA、QDA
  9. linux yum使用管理详细使用转载的
  10. 索尼克通信支付宝、超声波、蟋蟀和其他定制版本源代码