Leetcode105. 从前序和中序遍历构造二叉树 -- 递归
题目
解题思路
- 先序遍历顺序:根左右;
- 中序遍历顺序:左根右;
- 根据先序得到根节点位置;
- 根据根节点位置 结合中序,得到左右子树;
- 先序遍历、中序遍历中左右子树个数相同,可求出先序、中序中左右子树的下标;
- 利用 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. 从前序和中序遍历构造二叉树 -- 递归相关推荐
- 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 ...
- [leetcode] 105.从前序与中序遍历构造二叉树
给定一棵树的前序遍历 preorder 与中序遍历 inorder.请构造二叉树并返回其根节点. 示例 1: Input: preorder = [3,9,20,15,7], inorder = [ ...
- leetcode105. 从前序与中序遍历序列构造二叉树(递归)
根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20 ...
- Leetcode--105. 从前序与中序遍历序列构造二叉树(Java)
根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15 ...
- leetcode105.从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15 ...
- 二叉树前序中序后序_leetcode889_go_根据前序和后序遍历构造二叉树
leetcode889_根据前序和后序遍历构造二叉树 01 - 题目 返回与给定的前序和后序遍历匹配的任何二叉树. pre 和 post 遍历中的值是不同的正整数. 示例:输入:pre = [1,2, ...
- 二叉树题目 ----7 前序中序遍历构造二叉树
前序中序遍历构造二叉树 思路 在前序中找根结点 根据根结点 + 中序,分成左右两棵子树 根据子树长度,把前序分成左右两颗子树 递归处理子树 /*** Definition for a binary t ...
- 根据前序和后序遍历构造二叉树(附前序中序代码)
889. 根据前序和后序遍历构造二叉树 前序和中序 道理相同 改变一些细节就可以了,在最后附上了前序中序的代码 题目描述 返回与给定的前序和后序遍历匹配的任何二叉树. pre 和 post 遍历中的值 ...
- 数据结构---前序和中序遍历的二叉树序列还原二叉树
数据结构-前序和中序遍历的二叉树序列还原二叉树 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...
最新文章
- jQuery 变量数字相加
- 别把你的目光停留在周围
- mega_[MEGA DEAL]完整的Android开发人员课程–构建14个应用程序(91%折扣)
- 2020 云原生技术 7 大领域趋势全预测
- java 获取cer证书指纹_获取SSL证书的指纹
- 论文浅尝 | 利用冻结语言模型的多模态少样本学习
- java读mysql增量_在Java中检索MySQL自动增量
- Quartz2-Quartz与tomcat集成
- IntelliJ IDEA导出jar包
- Mac 修改开机登陆界面背景图, 替换沙漠背景图
- 【09年特长生第四题】开发区规划
- Postman接口与压力测试实例
- oracle 添加删除 某个字段,并添加注释
- python爬虫(以简书为例)
- python开发实例-python开发案例
- 如果恢复计算机系统时间吗,经常重置、恢复系统对电脑的影响大不大?
- P1_M4_L4 Longitudinal Vehicle Model(车辆纵向动力学建模)
- 实战五:手把手教你用TensorFlow进行房价预测
- JTable设置表头背景色
- x86 PSW 图解