剑指 Offer 07. 重建二叉树
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
标签:树、递归
题目
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
分析
知道一棵树的先序遍历和中序遍历,可以还原一颗二叉树。知道一棵树的先序遍历和后续遍历,也可以还原一颗二叉树。但如果知道中序遍历和后序遍历,是无法还原二叉树的,因为无法区分左右子树。
对于此题,假设有一颗二叉树的先序序列[3, 9, 6, 8, 20, 15, 7],中序序列[6, 9, 8, 3, 15, 20, 7],树是下面这个样子的

我们还原的步骤如下:
(1)根据先序遍历节点3,是树的根节点,然后在中序序列里查找3的位置,3左边的节点[6, 9 ,8]组成树的左子树,3右边的节点[15, 20, 7]组成树的右子树。
(2)对左子树重复步骤(1)
(3)对右子树重复步骤(1)
此题的难点在于如何确定左右子树的根节点。对于左子树,preorder[i +1]就是根节点,对于右子树,因为先序遍历是先走根节点再走左子树,那么只需要知道当前左子树有几个节点,就可以知道右子树的根节点了。
编码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return createTree(0, 0, inorder.length - 1, preorder, inorder);
}
private TreeNode createTree(int preStart, int inStart, int inEnd, int[] preorder, int[] inorder) {
if (preStart >= preorder.length || inStart > inEnd) {
return null;
}
// 根节点
TreeNode root = new TreeNode(preorder[preStart]);
int rootIndex = 0;
// 查找根节点在中序数组里的位置,拆分左右子树
for (int i = 0; i < inorder.length; i++) {
if (preorder[preStart] == inorder[i]) {
rootIndex = i;
break;
}
}
// 创建左子树
root.left = createTree(preStart + 1, inStart, rootIndex - 1, preorder, inorder);
// 创建右子树,rootIndex - inStart即当前左子树的节点数量
root.right = createTree(preStart + 1 + rootIndex - inStart, rootIndex + 1, inEnd, preorder, inorder);
return root;
}
}

剑指 Offer 07. 重建二叉树的更多相关文章
- #刷题记录--剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 抓住一点,通过递归进行节点创建时,是按照 前序遍历数组 进行创建的. 根节点,根节点的左 ...
- 剑指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 ...
随机推荐
- 《NO STRATEGY》《重塑战略》
书名:<NO STRATEGY> <重塑战略> 作者: [美]吉姆·柯林斯/[韩]W·钱·金/[美]迈克尔·波特(注意这个是内容的整理者不是内容作者) HBR:(Harvard ...
- 关于HTTP的一些概念
各种概念 HTTP HTTP(HyperText Transfer Protocol) -- 超文本传输协议 它可以拆成三个部分:"超文本"."传输".&quo ...
- 2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛总结
1003 Express Mail Taking 题意:有n个柜子(编号1-n),m封信,k号位置有钥匙,现在需要取信封,并且每取一次信封都要从k号位置进行领取一次钥匙,再去有信封的位置领取信封,问最 ...
- linux远程下载文件 的两种方法之 ftp命令和scp命令
ftp命令: 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件的拷贝读取和下载. 1. 连接ftp服务器 格式:ftp [hostname| ip-ad ...
- input type
input的type有: text 文本输入 password密码输入 file选择文件 radio单选按钮 checkbox复选按钮 submit对应form的action按钮 button 普通按 ...
- not full 和 default
create table t16( id int, name char(6), sex enum('male','female') not null default 'male'); insert i ...
- [Windows] 屏幕截图 - FastStone Capture(FSCapture) v9.4 飞扬时空汉化绿色版(官方地址) 【清晰好用 已验证】
[Windows] 屏幕截图 - FastStone Capture(FSCapture) v9.4 飞扬时空汉化绿色版(官方地址) [复制链接] 愤怒の葡萄 电梯直达 楼主 发表于 2 ...
- Linux 系统运行着许多子系统和应用程序。您可以使用系统日志记录从启动时就收集有关运行中系统的数据。有时
概述 在本教程中,您将学习以下内容: 配置 syslog 守护程序 了解标准设施.优先级和操作 配置日志轮换 了解 rsyslog 和 syslog-ng 系统内部发生了什么 Linux 系统运行着许 ...
- 2020 Kali Linux Zenmap 安装(可视化界面)
跟着教程学Kali Linux,我安装的2020版的,发现Zemap没被预装. 1.下载 zenmap https://nmap.org/download.html 2.rpm转deb 2020 Ka ...
- Linux——定时清空日志内容和删除日志文件
前言 最近在做性能压测试,会生成大量的日志,导致后续越压越慢,最终磁盘空间占满之类的问题.老是要手动删除日志文件,为避免此类问题发生,编写一个Linux日志定时清理的脚本,一劳永逸. 1.shell脚 ...