题目

解题思路

  • 先序遍历顺序:根左右;
  • 中序遍历顺序:左根右;
  • 根据先序得到根节点位置;
  • 根据根节点位置 结合中序,得到左右子树;
  • 先序遍历、中序遍历中左右子树个数相同,可求出先序、中序中左右子树的下标;
  • 利用 map 求出根节点的位置,map始终存的是中序遍历元素(包括 leetcode106也是);
  • 画图!画图!画图!画图可清楚的看出来左右子树的下标。

画图求左右子树下标


根据左右子树在先序和中序遍历中的个数相同,得出:
x - (preLeft + 1) = pIndex - 1 - inLeft
preRight - y = inRight - (pIndex + 1)

x = pIndex - inLeft + preLeft
y = preRight - inRight + pIndex + 1

根节点的值 rootVal = postOrder(postRight)
构造根节点 root = new TreeNode(rootVal)
根节点在中序遍历中的下标 pIndex = map.get(rootVal)

根据这些关键点,递归遍历构造出二叉树,最后 return root 即可。

Code part

var buildTree = function(preorder, inorder) {let preLen = preorder.lengthlet inLen = inorder.lengthif(preLen !== inLen) return let map = new Map()for(let i=0;i<inLen;i++){map.set(inorder[i],i)}//遍历左右子树,构造二叉树return build(preorder,0,preLen-1,map,0,inLen-1)};
function build(preorder,preLeft,preRight,map,inLeft,inRight){if(preLeft > preRight || inLeft > inRight){return null}let rootVal = preorder[preLeft]let root = new TreeNode(rootVal)let pIndex = map.get(rootVal) //中序根节点的位置//先序遍历中的左子树区间 & 中序遍历中的左子树区间root.left = build(preorder,preLeft+1,pIndex-inLeft+preLeft,map,inLeft,pIndex-1)//先序遍历中的右子树区间 & 中序遍历中的右子树区间root.right = build(preorder,pIndex-inLeft+preLeft+1,preRight,map,pIndex+1,inRight)return root
}

注意点
map中存的是中序遍历的节点,因为要利用根节点在中序遍历中的特殊位置,结合左右子树节点个数相同的点,求出左右子树的下标。
build参数中为左右子树的起始、结束下标位置。

Leetcode105. 从前序和中序遍历构造二叉树 -- 递归相关推荐

  1. leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)...

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

  2. [leetcode] 105.从前序与中序遍历构造二叉树

    给定一棵树的前序遍历 preorder 与中序遍历  inorder.请构造二叉树并返回其根节点. 示例 1: Input: preorder = [3,9,20,15,7], inorder = [ ...

  3. leetcode105. 从前序与中序遍历序列构造二叉树(递归)

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

  4. Leetcode--105. 从前序与中序遍历序列构造二叉树(Java)

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

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

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

  6. 二叉树前序中序后序_leetcode889_go_根据前序和后序遍历构造二叉树

    leetcode889_根据前序和后序遍历构造二叉树 01 - 题目 返回与给定的前序和后序遍历匹配的任何二叉树. pre 和 post 遍历中的值是不同的正整数. 示例:输入:pre = [1,2, ...

  7. 二叉树题目 ----7 前序中序遍历构造二叉树

    前序中序遍历构造二叉树 思路 在前序中找根结点 根据根结点 + 中序,分成左右两棵子树 根据子树长度,把前序分成左右两颗子树 递归处理子树 /*** Definition for a binary t ...

  8. 根据前序和后序遍历构造二叉树(附前序中序代码)

    889. 根据前序和后序遍历构造二叉树 前序和中序 道理相同 改变一些细节就可以了,在最后附上了前序中序的代码 题目描述 返回与给定的前序和后序遍历匹配的任何二叉树. pre 和 post 遍历中的值 ...

  9. 数据结构---前序和中序遍历的二叉树序列还原二叉树

    数据结构-前序和中序遍历的二叉树序列还原二叉树 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...

最新文章

  1. jQuery 变量数字相加
  2. 别把你的目光停留在周围
  3. mega_[MEGA DEAL]完整的Android开发人员课程–构建14个应用程序(91%折扣)
  4. 2020 云原生技术 7 大领域趋势全预测
  5. java 获取cer证书指纹_获取SSL证书的指纹
  6. 论文浅尝 | 利用冻结语言模型的多模态少样本学习
  7. java读mysql增量_在Java中检索MySQL自动增量
  8. Quartz2-Quartz与tomcat集成
  9. IntelliJ IDEA导出jar包
  10. Mac 修改开机登陆界面背景图, 替换沙漠背景图
  11. 【09年特长生第四题】开发区规划
  12. Postman接口与压力测试实例
  13. oracle 添加删除 某个字段,并添加注释
  14. python爬虫(以简书为例)
  15. python开发实例-python开发案例
  16. 如果恢复计算机系统时间吗,经常重置、恢复系统对电脑的影响大不大?
  17. P1_M4_L4 Longitudinal Vehicle Model(车辆纵向动力学建模)
  18. 实战五:手把手教你用TensorFlow进行房价预测
  19. JTable设置表头背景色
  20. x86 PSW 图解

热门文章

  1. 编程之美——电话号码对应英语单词
  2. 苹果微软为何热衷一体机?原因居然是这个
  3. [js]如何在codePen上打印控制台信息
  4. verilog偶校验码实现
  5. TeXstudio配置
  6. Grafana 8.4.4安装
  7. ipynb pycharm 运行_在pychar中写入ipynb文件,PyCharm,编写
  8. Python小常识(二)
  9. Emacs和Vim:神的编辑器和编辑器之神(转)
  10. 迷你 动态内存管理代码 适于嵌入式系统