Leecode剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析:
二叉树遍历规律:
前序遍历:【根节点, 递归前序遍历左子树,递归前序遍历右子树】
中序遍历:【递归中序遍历左子树,根节点,递归中序遍历右子树】
发现前序遍历数组的第一个元素是根节点,中序遍历数组中以根节点作为枢轴(pivot)把左右子树分隔开来,这样可以在中序遍历的数组中获取左子树和右子树的长度,再在前序遍历数组根据左右子树各自的长度
切割出前序遍历数组中的对应的左子树和右子树数组,然后递归的寻找每个子树的根节点返回并作为左/右子节点赋给上一个节点,如下图所示:

递归执行第一遍:前序[3,9,20,15,7],中序[9,3,15,20,7],根节点为3,切分得到新的左子树前序[9]、中序[9],右子树前序[20,15,7]、中序[15,20,7]
树:3
/ \
... ...
递归执行第二遍:前序[9],中序[9],长度只有1,故根节点是9,返回根节点
树:3
/ \
9 ...
递归执行第三遍:前序[20,15,7],中序[15,20,7],根节点是20,切分得到新的左子树前序[15]、中序[15],右子树前序[7]、中序[7],返回根节点
树:3
/ \
9 20
递归执行第四遍:前序[15],中序[15],长度只有1,故根节点是15,返回根节点
树:3
/ \
9 20
/
15
递归执行第五遍:前序[7],中序[7],长度只有1,故根节点是7,返回根节点,结束
树:3
/ \
9 20
/ \
15 7
递归解法:
1 /**
2 * Definition for a binary tree node.
3 * function TreeNode(val) {
4 * this.val = val;
5 * this.left = this.right = null;
6 * }
7 */
8 /**
9 * @param {number[]} preorder
10 * @param {number[]} inorder
11 * @return {TreeNode}
12 */
13 var buildTree = function(preorder, inorder) {
14 if(preorder.length===0||inorder.length===0) return null;
15 let root = new TreeNode(preorder[0]);
16 if(preorder.length===1) return root;
17 let index =inorder.findIndex(e => e === root.val);
18 root.left = buildTree(preorder.slice(1,index+1), inorder.slice(0,index));
19 root.right = buildTree(preorder.slice(index+1), inorder.slice(index+1));
20
21 return root;
22 };
迭代解法:
分析:
//TODO
实现:
var buildTree = function(preorder, inorder) {
if(preorder.length===0||inorder.length===0) return null;
let root = new TreeNode(preorder[0]);
let stack = [root];
let inorderIndex = 0;
let node;
for(let i=1, len = preorder.length; i<len; i++) {
let preorderVal = preorder[i];
node = stack[stack.length-1];
if(node.val !== inorder[inorderIndex]) {
node.left = new TreeNode(preorderVal);
stack.push(node.left);
}else{
while(stack.length!==0 && stack[stack.length-1].val===inorder[inorderIndex]){
node = stack.pop();
inorderIndex++;
}
node.right = new TreeNode(preorderVal);
stack.push(node.right);
}
}
return root;
};
Leecode剑指 Offer 07. 重建二叉树的更多相关文章
- #刷题记录--剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 抓住一点,通过递归进行节点创建时,是按照 前序遍历数组 进行创建的. 根节点,根节点的左 ...
- 剑指 Offer 07. 重建二叉树
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/ 标签:树.递归 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二 ...
- 剑指Offer:重建二叉树【7】
剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5 ...
- 《剑指offer》重建二叉树
本题来自<剑指offer> 重构二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2 ...
- 【Java】 剑指offer(6) 重建二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的 ...
- Go语言实现:【剑指offer】重建二叉树
该题目来源于牛客网<剑指offer>专题. 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4 ...
- 剑指OFFER之重建二叉树(九度OJ1385)
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...
- 剑指offer:重建二叉树
重建二叉树的前置知识: 0.遍历二叉树: (1)前序遍历:根左右 --> 先访问根节点,再前序遍历左子树,最后前序遍历右子树: (2)中序遍历:左根右 --> 先中序遍历左子树,再访问根节 ...
- 剑指Offer 4. 重建二叉树 (二叉树)
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 【剑指offer】重建二叉树
一.题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...
随机推荐
- AKS for Gitpod
------实习期间做的一个小项目 距今一个多月两个月----------------- 1.First Week local k8s 命令行:kubectl 运行Kubernetes: kind,m ...
- 从安装开发环境到第一个“hello world”
安装Java8 为什么要安装java8? java8和小破站的教程同步. 安装方法: 1.官网安装(我踩雷了,下载得慢,不过最后安装成功了!) 2.镜像网站:清华镜像 3.公众号(网上的全是套路了) ...
- LeetCode-1001 网格照明
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/grid-illumination 题目描述 在大小为 n x n 的网格 grid 上,每个单元 ...
- 红米手机刷 LineageOS (实操)
参考:https://miuiver.com/how-to-flash-lineageos/ 实操机型:红米note8 1. 下载Android Platform-Tools 2. 下载对应机型的TW ...
- freeRTOS移植成功
今天来学习如何移植freeRTOS 也算是走了很多的坑,总算是把系统跑起来了 相关的教程网上也有比较详细的,本文主要说说自己踩的坑 一些汇编文件报错的问题 这个问题的原因是因为网上大部分的移植说明都是 ...
- go语言 cmd执行命令,遇到空格或者双引号无法执行成功的解决方案
大部分go执行cmd命令都是,我也是这样写的 package main import ( "fmt" "os/exec" ) func main() { cmd ...
- python 多进程和异步io的有机结合 Error in atexit._run_exitfuncs
众所周知,python的多线程开发在GIL(全局器解释锁)下饱受诟病,在单核模式下搞多线程对效率的提升相当有限.于是大家的共识就是搞io密集的程序,建议采用多线程,计算密集型的程序就搞多进程.近期的一 ...
- Linux(CentOS) Mysql 8.0.30 安装(多源安装)
Linux(CentOS) Mysql 8.0.30 安装(多源安装) 安装命令根据实际部署情况修改调整,CentOS一般选择通用版本Red Hat Enterprise Linux 7 本文档使用w ...
- 创建一个与a.txt文件同目录下的另一个文件b.txt
File file1 = new("d:\\a\\a.txt"); File file2 = new(file1.getParent(),"b.txt"): F ...
- Springcloud gateway整合(集成)swagger2+finfe4j踩坑
项目使用gateway代替之前的zuul网关,需要整合swagger,踩了许多坑之后终于解决问题,话不多说直接上代码 因为使用的是阿里的东西所以注册中心选择了nacos,它的配置这里就不贴了 spri ...