构造二叉树-前中与后中【LeetCode-105/106】

  • 1.题目描述
  • 2.解题思路
  • 3.具体代码

1.题目描述

要求1:根据二叉树的前序和中序遍历结果,构造二叉树。给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]要求2:根据二叉树的中序和后序遍历结果,构造二叉树。给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

2.解题思路

这两个要求的代码基本类型,都必须要有中序遍历的参与:

前序和中序可以唯一确定一棵二叉树。

后序和中序可以唯一确定一棵二叉树。

那么前序和后序可不可以唯一确定一棵二叉树呢?

前序和后序不能唯一确定一棵二叉树!,因为没有中序遍历无法确定左右部分,也就是无法分割。

3.具体代码

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

 public TreeNode buildTree3(int[] preorder, int[] inorder) {return helper(preorder, 0, preorder.length - 1,inorder, 0, inorder.length - 1);}public TreeNode helper(int[] preorder, int preLeft, int preRight,int[] inorder, int inLeft, int inRight) {// 递归终止条件if (inLeft > inRight || preLeft > preRight) return null;// val 为前序遍历第一个的值,也即是根节点的值// idx 为根据根节点的值来找中序遍历的下标int idx = inLeft, val = preorder[preLeft];TreeNode root = new TreeNode(val);for (int i = inLeft; i <= inRight; i++) {if (inorder[i] == val) {idx = i;break;}}// 根据 idx 来递归找左右子树root.left = helper(preorder, preLeft + 1, preLeft + (idx - inLeft),inorder, inLeft, idx - 1);root.right = helper(preorder, preLeft + (idx - inLeft) + 1, preRight,inorder, idx + 1, inRight);return root;}

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

    public TreeNode buildTree2(int[] inorder, int[] postorder) {return buildTree1(inorder, 0, inorder.length, postorder, 0, postorder.length);}public TreeNode buildTree1(int[] inorder, int inLeft, int inRight,int[] postorder, int postLeft, int postRight) {// 没有元素了if (inRight - inLeft < 1) {return null;}// 只有一个元素了if (inRight - inLeft == 1) {return new TreeNode(inorder[inLeft]);}// 后序数组postorder里最后一个即为根结点int rootVal = postorder[postRight - 1];TreeNode root = new TreeNode(rootVal);int rootIndex = 0;// 根据根结点的值找到该值在中序数组inorder里的位置for (int i = inLeft; i < inRight; i++) {if (inorder[i] == rootVal) {rootIndex = i;break;}}// 根据rootIndex划分左右子树root.left = buildTree1(inorder, inLeft, rootIndex,postorder, postLeft, postLeft + (rootIndex - inLeft));root.right = buildTree1(inorder, rootIndex + 1, inRight,postorder, postLeft + (rootIndex - inLeft), postRight - 1);return root;}

力扣(LeetCode)原题链接

LeetCode-105/106相关推荐

  1. 自我总结:Leetcode 654, 105, 106, 889

    终于算是熬过期末以后想起来了学学习了哈哈哈哈. 今天看看二叉树的构造,以下内容为自我学习总结,主要目的为学习笔记,兼职传播小想法.内容为学习labuladong的学习笔记.以下为链接,感谢大佬的学习讲 ...

  2. [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...

  3. LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++...

    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++ Given preo ...

  4. LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal

    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 本博客转载自:http://www.cnblogs.co ...

  5. 贴片电容102 103 104 105 106分别是多少?

    贴片电容102 103 104 105 106分别是多少,贴片电容型号有很多种换算方法,但是我们只需要知道一种就好了,下面我们来看看贴片电容102 103 104 105 106容值大小怎么表示. 贴 ...

  6. [LeetCode]*105.Construct Binary Tree from Preorder and Inorder Traversal

    题目 Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume t ...

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

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

  8. LeetCode 105 Construct Binary Tree from Preorder and Inorder Traversal-前序中序遍历构造二叉树-Python和Java递归解法

    题目地址:Construct Binary Tree from Preorder and Inorder Traversal - LeetCode Given preorder and inorder ...

  9. Leetcode 105. 前序和中序遍历序列构造二叉树

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

  10. LeetCode: 105. Construct Binary Tree from Preorder and Inorder Traversal

    题目 Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume t ...

最新文章

  1. 设置VSCode隐藏菜单栏快捷键Alt+T(头部)、隐藏状态栏快捷键Alt+B(底部),为单屏开发者腾出更多编码空间
  2. C和指针---第六章:指针
  3. Spring MVC开发环境搭建
  4. Java中的数组,列表,集合,映射,元组,记录文字
  5. html css 表头,css固定表格表头(各浏览器通用)
  6. nucleo stlink 固件_自制nucleo,可以随意更换芯片,支持stlink,板载usbisp
  7. FoundationDB 开源文档数据库模型 Document Layer​​​​​​​
  8. Solaris 10 X86安装备忘
  9. import torch 找不到模块_15天Python入门-15-模块与包
  10. StackPanel:栈式面板基础简述
  11. MySQL复制表结构、表数据的方法
  12. 使用MATLAB进行多元非线性回归拟合预测
  13. [Jenkins]jenkins配置163邮箱做邮件发送
  14. 标准解读系列之三:智慧高速建设需要什么样的技术架构?
  15. 高效算法,B*寻路算法,python版,思维优化(1)
  16. 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext报错
  17. JAVAWEB开发之——Linux命令总结
  18. 为什么输入法显示中文打不出中文_输入法为什么打不出汉字_电脑输入法打不出汉字如何解决-win7之家...
  19. 创业文章:长风破浪会有时
  20. 欧盟更新玩具安全指令 2009/48/EC 协调标准

热门文章

  1. 【项目】C语言实现对英文文本按字典顺序排序(1~100万+个单词,多种排序算法选择)
  2. python 获得一个月有多少天
  3. matlab .vcd文件导入,DUMP VCD文件
  4. 爬虫学习----解决中文乱码
  5. 计算飞机跑道长度C语言,中国各个机场跑道长度
  6. 全国工企专利匹配数据(1998-2014)
  7. 【调剂】北京林业大学工学院程朋乐副教授课题组拟招收计算机、自动化等专业调剂生...
  8. 《数据结构》严蔚敏第二版 2.53 循环链表,双向链表
  9. 【书评:Oracle查询优化改写】第四章
  10. 深度学习Java枚举(enum)——枚举虽小,五脏俱全