文章目录

  • 题目描述
  • 代码 & 思路

题目描述

  • 这题主要是考察前序、后序的性质,以及相互间的关系

代码 & 思路

  • 前序:根 - 左 - 右; 中序:左 - 根 - 右,那么用前序数组的首位(即根)的值到中序数组查找对应位置,就可以由此得到左右子树的结点数。
  • 递归进行,每次构造当前根结点,然后开启左、右子树的递归函数即可。
  • 用一次循环来构建<根结点val,中序index>的哈希表,就不用每次都循环查找一次根节点index。
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {/**如何递归?题目要求:给定前序和后序,构造树。既然是前序和后序,那么数组中左子树和右子树一定可以分离成两个连续子数组冲!*/public TreeNode buildTree(int[] preorder, int[] inorder) {// 根据preorder中的一个值,就能找到在inorder中的位置Map<Integer,Integer> map = new HashMap();for(int i=0;i < inorder.length;i++){map.put(inorder[i],i);}return toBuildTree(new TreeNode(),preorder,0,preorder.length-1,inorder,0,inorder.length-1,map);}TreeNode toBuildTree(TreeNode root, int[] preorder, int pL, int pR, int[] inorder, int iL, int iR, Map<Integer,Integer> map){// 找到root.val在inorder中的位置int rootIndex = map.get(preorder[pL]);root = new TreeNode(inorder[rootIndex]);// 左右子树结点数量int leftNum = rootIndex - iL;int rightNum = iR - rootIndex;// 左右子树构建if(leftNum > 0){root.left = toBuildTree(root.left, preorder, pL + 1, pL + leftNum, inorder, iL, rootIndex - 1, map);}if(rightNum > 0){root.right = toBuildTree(root.right, preorder, pL + leftNum + 1, pR, inorder, rootIndex + 1, iR, map);}return root;}
}
  • 无注释版
class Solution {Map<Integer, Integer> hashmap = new HashMap<>();public TreeNode buildTree(int[] preorder, int[] inorder) {for(int i = 0; i < inorder.length; i++) {hashmap.put(inorder[i], i);}return toBuildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);}public TreeNode toBuildTree(int[] preorder, int pL, int pR, int[] inorder, int iL, int iR) {int rootIndex = hashmap.get(preorder[pL]);TreeNode root = new TreeNode(preorder[pL]);int leftNum = rootIndex - iL;int rightNum = iR - rootIndex;if(leftNum > 0) {root.left = toBuildTree(preorder, pL + 1, pL + leftNum, inorder, iL, rootIndex - 1);}if(rightNum > 0) {root.right = toBuildTree(preorder, pL + leftNum + 1, pR, inorder, rootIndex + 1, iR);}return root;}
}

【LeetCode笔记】105. 从前序与中序遍历序列构造二叉树(Java、递归、二叉树、哈希表)相关推荐

  1. 【LeetCode】105#从前序与中序遍历序列构造二叉树

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...

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

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

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

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

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

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

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

    两题各自的链接放这里了: 链接: 106 链接: 105 106.从中序与后序遍历序列构造二叉树 如果你是不知道理论的,那就得仔细分析了, 举个例子: 输入:inorder = [9,3,15,20, ...

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

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

  7. leetcode 105. 从前序与中序遍历序列构造二叉树 c语言递归解法

    如题: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素.例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3 ...

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

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

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

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

  10. Leetcode 105. 从前序与中序遍历序列构造二叉树 解题思路及C++实现

    解题思路: 前序遍历preorder中,第一个即为根节点,然后找到中序遍历inorder中对应的节点,则inorder中该节点之前的值均在根节点的左子树上,该节点后面的值都在根节点的右子树上,所以可以 ...

最新文章

  1. 【CVPR 2020】神经网络架构搜索(NAS)论文和代码汇总
  2. 牛客网华为机试题 字符串问题 记录
  3. 企业网站建设|优秀的网站都是靠这些细节做成功的
  4. Webstorm修改svn时提示Error relocating working copy:Server SSL certificate rejected
  5. poj1182(食物链)续
  6. 1036 Boys vs Girls (25 分)_27行代码AC
  7. c语言使用未初始化的内存怎么解决_C语言快速入门——数组与调试进阶
  8. dnf台服升级mysql_MySQL Yum存储库 安装、升级、集群
  9. [翻译] ZCSHoldProgress
  10. MacBook安装Mysql
  11. 手机数控模拟器安卓版_CNC模拟器安卓中文版下载
  12. 大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?
  13. 数据库中的内连接、自然连接、和外连接的区别
  14. 基于JSP和SQL的CD销售管理系统
  15. 第九届蓝桥杯C++A组
  16. 基于收发一体超声波探头的超声波测距方案(附源代码和原理图)
  17. java电子贺卡_基于JAVA WEB的电子贺卡,请帖制作系统
  18. java dead store_jcip Java并发编程实战源码,这本书名为《 践》有些抹杀了它的价值,其中 Develop 238万源代码下载- www.pudn.com...
  19. 实施不良资产证券化 信用评级不能少
  20. python GPS解析,坐标转换,两经纬度直线距离,方位角

热门文章

  1. 计算机电力英语翻译,电力专业英语阅读与翻译..doc
  2. vue 找回密码_vue实现个人信息查看和密码修改功能
  3. 支持向量机matlab代码程序_支持向量机(SVM)小结
  4. 安卓系统挂载NTFS格式硬盘_苹果电脑挥之不去的烦恼!怎样兼容NTFS格式的U盘移动硬盘?...
  5. MATLAB报错Invalid ADAPTORNAME specified. Type 'imaqhwinfo' for a list of available ADAPTORNAMEs. Image
  6. JPA EntityManagers,事务及其周围的一切
  7. php伪静态不支持中文,wordpress伪静态如何支持中文(目前不支持分类目录中文)...
  8. java炸弹人素材_炸弹人图片_炸弹人模板_炸弹人设计素材下载
  9. c++全局类对象_C++ 类在内存中的存储方式(一)
  10. html文本弹性,HTML5 很有趣的文本蹦床/弹性弯曲动效