根据前序与中序遍历序列构建二叉树

LeetCode题目来源

1.1 题目描述

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

1.2 示例

2.1 解题

2.1.1 解题方法:使用递归进行计算

解题思路:根据前序遍历数组preorder依次确定根节点root,然后根据root在inorder中的索引确定根节点的左子树与右子树,将左右子树放入递归中,产生新的根节点和新的左右子树,当递归到最小元素,即preorder_left == preorder_right,会将root返回到上一个root.left或者root.right。

Java版解题

/*** 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 {private Map<Integer, Integer> indexMap;public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {if (preorder_left > preorder_right) {return null;}// 前序遍历中的第一个节点就是根节点int preorder_root = preorder_left;// 在中序遍历中定位根节点int inorder_root = indexMap.get(preorder[preorder_root]);// 先把根节点建立出来TreeNode root = new TreeNode(preorder[preorder_root]);// 得到左子树中的节点数目int size_left_subtree = inorder_root - inorder_left;// 递归地构造左子树,并连接到根节点// 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素root.left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);// 递归地构造右子树,并连接到根节点// 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素root.right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);return root;}public TreeNode buildTree(int[] preorder, int[] inorder) {int n = preorder.length;// 构造哈希映射,帮助我们快速定位根节点indexMap = new HashMap<Integer, Integer>();for (int i = 0; i < n; i++) {indexMap.put(inorder[i], i);}return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);}
}

1.myBuildTree方法中参数的含义:
表示左/右子树在preorder/inorder数组中的范围,preorder_left表示迭代中左子树在preorder数组中起始索引,preorder_right表示preorder数组中左子树范围结束索引,inorder_left,inorder_right表示同一棵子树在inorder数组中范围。
2.递归结束条件为preorder_left > preorder_right:
当递归到最小单位——一个数时,inorder_root - inorder_left = 1,则最后一次递归时inorder_root == preoder_right,对于只有左节点而无右节点的子树,preorder+size_left_subtree+1 > preorder_right,直接返回null.

解题结果

根据中序与后序遍历序列构建二叉树

LeetCode题目来源

1.1 题目描述

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

1.2 示例

2.1 解题

2.1.1 解题方法:使用递归进行计算

根据后续遍历得到每次迭代的根节点,根据中序遍历得到迭代的左右子树,思路同上。

Java版解题

/*** 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 {private Map<Integer,Integer>indexMap;public TreeNode buildTree(int[] inorder, int[] postorder) {int n = inorder.length;indexMap = new HashMap<Integer,Integer>();for(int i = 0; i < n; i++){indexMap.put(inorder[i],i);}return myBuildTree(inorder,postorder,0,n-1,0,n-1);}public TreeNode myBuildTree(int[] inorder,int[] postorder,int inorder_left,int inorder_right,int postorder_left,int postorder_right){if(inorder_left > inorder_right) return null;int postorder_root = postorder_right;int inorder_root = indexMap.get(postorder[postorder_root]);TreeNode root =  new TreeNode(postorder[postorder_root]);int size_left_subtree = inorder_root - inorder_left;root.right = myBuildTree(inorder,postorder,inorder_root + 1,inorder_right,postorder_left+size_left_subtree,postorder_right-1);root.left = myBuildTree(inorder,postorder,inorder_left,inorder_root - 1,postorder_left,postorder_left+size_left_subtree-1);return root;}
}

解题结果

根据前序与后序遍历序列构建二叉树

LeetCode题目来源

1.1 题目描述

给定两个整数数组,preorder 和 postorder ,其中 preorder 是一个具有 无重复 值的二叉树的前序遍历,postorder 是同一棵树的后序遍历,重构并返回二叉树。
如果存在多个答案,您可以返回其中 任何 一个。

1.2 示例

2.1 解题

2.1.1 解题方法:使用递归进行计算

每轮递归根据preorder数组的index锁定root节点,root的左子树和右子树由数组preorder中index+1位置的值在postorder中的位置index1确定,index1以及其数组左边的值为当前root左子树的值,index1+1及以后的值为当前root右子树的值。

Java版解题

class Solution {HashMap<Integer, Integer> postHashMap = new HashMap<Integer, Integer>();int[] pre;public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {for (int i = 0; i < postorder.length; i++) {postHashMap.put(postorder[i], i);}pre = preorder;return buildTree(0, postorder.length - 1, 0, preorder.length - 1);}public TreeNode buildTree(int post_start, int post_end, int pre_start, int pre_end) {if (post_start > post_end || pre_start > pre_end) return null;int root = pre[pre_start];TreeNode node = new TreeNode(root);if (pre_start == pre_end) return node;int index = postHashMap.get(pre[pre_start + 1]);node.left = buildTree(post_start, index, pre_start + 1, pre_start + index - post_start + 1);node.right = buildTree(index + 1, post_end - 1, pre_start + index - post_start + 2, pre_end);return node;}
}

解题结果

LeetCode根据前序与中序、中序与后序,前序与后序遍历序列构建二叉树相关推荐

  1. 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

    1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...

  2. 基于层序+中序遍历序列构建二叉树

    问题是:基于层序遍历序列+中序遍历序列唯一建立一棵树,然后输出前序,后序遍历序列. 四种遍历树的思路以及代码自然不必多言,有趣的是如何由层序+中序建立树. 首先需要说的是,这个也是递归解法. http ...

  3. Leetcode106 由中序序列和后序序列构建二叉树

    最难的地方在于对序列的下标计算,比如给定一个序列,开始下标是i,那么下标i+1就是开始元素的后一个元素,注意到,1还是当前元素组成的列表的元素个数.即i + size,是包含i元素在内的size个数组 ...

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

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

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

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

  6. 【LeetCode系列】从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树 ...

  7. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

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

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

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

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

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

最新文章

  1. 【安全漏洞】某CMS后台防护逻辑漏洞导致GETSHELL
  2. 双向链表实现电话簿C++代码实现
  3. 1.18.5.流式概念、动态表(Dynamic Table)、DataStream上的关系查询、动态表 连续查询(Continuous Query)、在流上定义表、处理时间
  4. linux删除物理卷命令,如何安全的删除Linux LVM中的PV物理卷(硬盘或分区
  5. BEM思想之彻底弄清BEM语法
  6. 标准RTSP 消息的错误代码
  7. python实现注册登录检验系统的源代码_Django自带的用户验证系统实现
  8. 使用GRUNT压缩和合并js文件
  9. 数据绑定以及Container.DataItem几种方式与使用方法分析
  10. Visual Studio(VS2017/VS2019) C++ 配置 CPLEX 教程
  11. WordPress主题插件Modown6.1绿色版+Erphpdown11.6等多插件
  12. 高等工程数学(一):线性空间
  13. 对自然数e的理解,推导(基础)
  14. Python爬虫网页元素定位术,就在这篇博客中
  15. 相机镜头光学中的一些疑难问题的解释
  16. 38掌握分布式存储系统 GlusterFS 的基本用法,包括卷管理、数据复制
  17. 城市轨道交通站应急照明疏散指示系统设计
  18. 其实袁萌还是挺可爱的
  19. linux桌面 高分屏,让Linux下GNOME桌面、GDM登录界面适应高分屏的方法
  20. C语言——冒泡排序、改进的冒泡排序

热门文章

  1. 113 错误 mysql_mysql添加,授权,删除用户以及连接数据库Can't connect to MySQL server on '192.168.31.106' (113)错误排查...
  2. 随机游走(Random Walk)模型
  3. 塑料周转箱的低碳环保之路
  4. 新政出台,网络货运推动物流高质量发展
  5. linux系统编程之信号(四):信号的捕捉与sigaction函数
  6. Plant Simulation新版本2201测试记录
  7. 软件测试基础知识总结面试题(二)
  8. 评高级经济师需要考英语和计算机吗山东,我是山东的,想考高级经济师,听说要参加职称外语..._高级经济师_帮考网...
  9. 重温经典《闻香识女人》
  10. 【算法】树形DP ② 打家劫舍Ⅲ(树上最大独立集)