两题各自的链接放这里了:
链接: 106
链接: 105

106.从中序与后序遍历序列构造二叉树

如果你是不知道理论的,那就得仔细分析了,
举个例子:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

在这个实例中结合我们对中序遍历(左中右)和后序遍历(左右中)的了解我们不难发现这其中肯定有一定的联系(当然题目都这么出,肯定暗藏玄机啦),
你看,你仔细看:

  • 中序遍历–>通过中间节点把左右节点都分开了
  • 而后序遍历又正好摆明了对应数组的最后一个元素就是当前的中间节点
    那么关键来了,如何把一个小规律推广到代码中实现对应构造二叉树的功能呢?
    这摆明了,就是让你使用递归嘛,(一个大树又可以分成无数个小树)
    具体就是我们每取出一个postorder的最后一个元素,就通过这个元素的数值来找到其在inorder的位置,然后左边为左子树,右边为右子树,如此循环往复,就可以了.
    递归的退出条件则是:当要用来构造左子树的部分为null ||构造右子树的部分为null(如何得出这个条件呢?–>当时的我会觉得就算构造左子树的部分null了,那么我们不也可以接着构造右子树吗?然后才发现在这个情况下直接return是没有问题的,右子树的的部分会在上一个栈帧去接着递归(终究是题刷少了))(但是我们再想把||换成&&可以吗?当然不可以,要是你左边没有了,而右边有,岂不是会因此给再new左边节点,甚至可能空指针)(我们写这个退出条件主要就是要同时让左右子树都能正常按我们的逻辑进行)
    代码如下:
    写代码时还要注意对每个区间的取值
class Solution {//利用hashmap建立索引来快速查找postorder[postorder.length-1]Map<Integer,Integer> map;public TreeNode buildTree(int[] inorder, int[] postorder) {map=new HashMap<>();for (int i = 0; i < inorder.length; i++) {map.put(inorder[i],i);}return getNode(inorder,0,inorder.length,postorder,0,postorder.length);}public TreeNode getNode(int[]inorder,int inBegin,int inEnd,int[]postorder,int postBegin,int postEnd){//以下关于区间全部使用左闭右开if(inBegin>=inEnd||postBegin>=postEnd){return null;}int middleIndex=map.get(postorder[postEnd-1]);TreeNode middleNode=new TreeNode(postorder[postEnd-1]);int lenOfLeft=middleIndex-inBegin;middleNode.left=getNode(inorder,inBegin,middleIndex,postorder,postBegin,postBegin+lenOfLeft);middleNode.right=getNode(inorder,middleIndex+1,inEnd,postorder,postBegin+lenOfLeft,postEnd-1);return middleNode;}
}

105从前序与中序遍历序列构造二叉树
其实差不多,我们上面那个是利用后序遍历的最后一个就是中间节点,
而前序只不过是第一个就是中间节点.
代码如下:

class Solution {Map<Integer,Integer> map;public TreeNode buildTree(int[] preorder, int[] inorder) {//老方法递归//与之前的中序后序的区别是换成中序和前序//其实基本上差不多//在中序后序的破解上//核心无非就是找到中节点//前序与后序无非是一个在最前面一个在最后面map=new HashMap<>();for (int i = 0; i < inorder.length; i++) {map.put(inorder[i],i);}//一样的递归逻辑在这就省略了return getNode(inorder,0, inorder.length, preorder,0, preorder.length);}public TreeNode getNode(int[]inorder,int inBegin,int inEnd,int[]preorder,int preBegin,int preEnd){//一样的左闭右开//退出条件if(inBegin>=inEnd||preBegin>=preEnd){return null;}int middleIndex=map.get(preorder[preBegin]);TreeNode node=new TreeNode(inorder[middleIndex]);int lenOfLeft=middleIndex-inBegin;node.left=getNode(inorder,inBegin,middleIndex,preorder,1+preBegin,preBegin+lenOfLeft+1);node.right=getNode(inorder,middleIndex+1,inEnd,preorder,lenOfLeft+preBegin+1,preEnd);//不对劲,原先以为可以硬套,结果发现,还是我们需要reverse一下,//三思过后,还是可以的,就是和那啥相反一下就可以了//我们这个preorder还有一个地方需要减1,应该不用了,我们通过+lenOfLeft跳过了return node;}
}

【必拿下系列】106. 从中序与后序遍历序列构造二叉树105从前序与中序遍历序列构造二叉树相关推荐

  1. leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析

    目录 1.106题目 2.参考思路:递归切割数组 3.105题目 4.同样思路的代码 1.106题目 2.参考思路:递归切割数组 代码参考:公众号:代码随想录 后序数组+中序数组 以 后序数组(左右中 ...

  2. 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)

    引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...

  3. LeetCode 刷题之旅(2020.05.22)——105. 从前序与中序遍历序列构造二叉树(中)

    LeetCode 刷题之旅(2020.05.22)--105. 从前序与中序遍历序列构造二叉树(中) 题目: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如, ...

  4. 【LeetCode】【HOT】105. 从前序与中序遍历序列构造二叉树(哈希表+递归)

    [LeetCode][HOT]105. 从前序与中序遍历序列构造二叉树 文章目录 [LeetCode][HOT]105. 从前序与中序遍历序列构造二叉树 package hot;import java ...

  5. C/C++编程笔记:数据结构二叉树的查找(前序、中序、后序、层序遍历)

    建立一棵含有n个结点的二叉树,采用二叉链表存储: 输出前序.中序.后序..层序遍历该二叉树的遍历结果. 定义二叉树的数据类型--二叉树结点结构体BiNode.建立二叉链表可以采用扩展二叉树的一个遍历序 ...

  6. 收藏||二叉树的遍历:颜色标记法(前序、中序、后序通用)

    参考力扣题解 作者:hzhu212 链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/yan-se- ...

  7. 二叉树 中序遍历 python_leetcode No.105 从前序与中序遍历序列构造二叉树

    题目链接: 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)​leetcode-cn.com 题目描述: 根据一棵树的前序遍历与中序遍历构造二叉树,可以假设树中没有重复的元素. 示例: 前 ...

  8. 线索二叉树原理及前序、中序线索化(Java版)

    转载 原文地址:https://blog.csdn.net/UncleMing5371/article/details/54176252 一.线索二叉树原理 前面介绍二叉树原理及特殊二叉树文章中提到, ...

  9. leetcode 105. 从前序与中序遍历序列构造二叉树

    难度:中等 频次:68 题目: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点 ...

最新文章

  1. MySQL中的联合查询
  2. android音视频工程师,音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)...
  3. php的ajax实例
  4. 前端学习(3020):vue+element今日头条管理--创建路由和配置路由
  5. a/a的4种链接方式
  6. ffmpeg最新源代码(定期更新)
  7. ggplot2箱式图两两比较_第十九章_使用ggplot2进行高级绘图
  8. CSS深入理解学习笔记之vertical-align
  9. java 数组覆盖_JavaSE——数组集合
  10. Web存储—本地存储Cookie
  11. 谷歌推出开源工具DeepVariant,用深度学习识别基因变异
  12. Dynamic Entity Representation with Max-pooling Improves Machine
  13. visualmap超过范围改变颜色_换种颜色,换种心情——车身改色
  14. vasp和ms_采用MS建模的基本步骤以及vasp新手入门需要注意的十个简单问题
  15. 计划排产软件助力厨房电器业提升管理
  16. 基于RiskPariyBlackLitterman的因子择时
  17. ios发布证书过期怎么办?
  18. 树莓派能做什么呢?如何使用树莓派
  19. 什么是空指针?如何从根源避免空指针
  20. 使用 spring 集成 dbcp 数据库连接池到 Wowza 插件

热门文章

  1. [BJDCTF 2nd] Web复现 wp
  2. uva1471 Defense Lines
  3. VTP-------详解
  4. Monkey框架(测试方法篇) - monkey日志分析
  5. Python自动登陆淘宝并爬取商品数据
  6. 隐私计算工程化之殇,为什么“久攻不破”?
  7. 什么是EE(exploration and exploitation)问题
  8. 【线性代数之一】行列式计算
  9. 二、Eureka服务注册与发现
  10. 水深6到9米有鱼吗_钓大鱼就要打重窝?别一概而论,根据鱼的摄食量来打窝才对路...