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

Offer_33

题目详情

题解分析

  • 本题需要注意的是,这是基于一颗二叉排序树的题目,根据排序二叉树的定义,中序遍历序列就是数据从小到大的排序序列。
  • 这里有很多的细节问题,特别是在递归时,需要注意递归的出口和判断条件。

解法一:传统的方法

  1. package com.walegarrett.offer;
  2. /**
  3. * @Author WaleGarrett
  4. * @Date 2021/2/1 16:45
  5. */
  6. import java.util.Arrays;
  7. /**
  8. * 题目详情:输入一个整数数组,判断该数组是不是 **某二叉搜索树 ** 的后序遍历结果。
  9. * 如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
  10. */
  11. public class Offer_33 {
  12. int[] postorder;
  13. int[] inorder;
  14. public boolean verifyPostorder(int[] postorder) {
  15. this.postorder = postorder;
  16. inorder = Arrays.copyOf(postorder, postorder.length);
  17. Arrays.sort(inorder);//中序遍历序列
  18. return rebuildBinaryTree(0, inorder.length - 1, 0, postorder.length -1);
  19. }
  20. boolean rebuildBinaryTree(int infrom, int inend, int postfrom, int postend){
  21. if(inend < infrom || postend < postfrom)
  22. return true;
  23. int root = postorder[postend];
  24. int index = -1;
  25. for(int i = infrom; i<= inend; i++){
  26. if(inorder[i] == root){
  27. index = i;
  28. break;
  29. }
  30. }
  31. //System.out.println(infrom + " " + inend + " " + postfrom + " " + postend + " " +index);
  32. if(index == - 1)
  33. return false;
  34. int numLeft = index - infrom;
  35. return rebuildBinaryTree(infrom, index-1, postfrom, postfrom + numLeft -1) &&
  36. rebuildBinaryTree(index+1, inend, postfrom + numLeft, postend - 1);
  37. }
  38. }

解法二:仅仅使用后序遍历序列进行递归分治

解法二来自:面试题33. 二叉搜索树的后序遍历序列(递归分治 / 单调栈,清晰图解)

  1. class Solution {
  2. public boolean verifyPostorder(int[] postorder) {
  3. return recur(postorder, 0, postorder.length - 1);
  4. }
  5. boolean recur(int[] postorder, int i, int j) {
  6. if(i >= j) return true;
  7. int p = i;
  8. while(postorder[p] < postorder[j]) p++;
  9. int m = p;
  10. while(postorder[p] > postorder[j]) p++;
  11. return p == j && recur(postorder, i, m - 1) && recur(postorder, m, j - 1);
  12. }
  13. }

剑指 Offer 33. 二叉搜索树的后序遍历序列 + 根据二叉树的后序遍历序列判断对应的二叉树是否存在的更多相关文章

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

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

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

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

  3. 每日一题 - 剑指 Offer 33. 二叉搜索树的后序遍历序列

    题目信息 时间: 2019-06-26 题目链接:Leetcode tag:分治算法 递归 难易程度:中等 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 tr ...

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

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

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

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

  6. 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树

    剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...

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

    剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ...

  8. 力扣 - 剑指 Offer 54. 二叉搜索树的第k大节点

    题目 剑指 Offer 54. 二叉搜索树的第k大节点 思路1 二叉搜索树的特性就是中序遍历结果为递增序列,而题目要求的是第 k 大节点,所以就应该是要遍历结果为降序, 按照先遍历左子树.输出节点.遍 ...

  9. 【剑指Offer】二叉搜索树与双向链表 解题报告(Python)

    [剑指Offer]二叉搜索树与双向链表 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...

随机推荐

  1. 二分图最大权匹配问题&&KM算法讲解 && HDU 2255 奔小康赚大钱

    作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...

  2. Checkout Assistant CodeForces - 19B

    题意: 给你n个物品,每个物品有一个价格ci和一个支付时间ti,在这个ti时间内,你可以免费拿ti个物品.问你想要带走这n个物品最小需要多少钱 题解: 原本还想着贪心去写,但是好像贪心写不了,,,不属 ...

  3. WPF 主动触发依赖属性的 PropertyChanged

    需求背景 需要显示 ViewModel 中的 Message/DpMessage,显示内容根据其某些属性来确定.代码结构抽象如下: // Model public class Message : IN ...

  4. leetcode15 三数之和 双指针

    注意题目没要求数字只能用一次 a + b + c = 0 即为 -b=a+c,同时要求数字不全为正(然后发现a+b+c就行...不过多想想没坏处嘛) 先处理特殊情况,然后 先排序 注意不重复,只需要有 ...

  5. C++程序代码优化的方法

    1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多.数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组 ...

  6. javascript & call & apply & bind & new

    javascript & call & apply & bind & new Javascript call() & apply() vs bind()? ht ...

  7. koa url path & koa-router

    koa url path & koa-router url path & regex koa path router "use strict"; /** * * @ ...

  8. VirtualBox All in One

    VirtualBox All in One 虚拟机 / VM / Virtual Machine x86 and AMD64/Intel64 VirtualBox is a powerful x86 ...

  9. 如何在 macOS 上进行滚动截屏

    如何在 macOS 上进行滚动截屏 Shift-Command-5 https://support.apple.com/zh-cn/guide/mac-help/mh26782/mac demo Xn ...

  10. Dart DevTools & Flutter

    Dart DevTools & Flutter https://flutter.dev/docs/development/tools/devtools/overview https://dar ...