输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

前序遍历 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. 重建二叉树的更多相关文章

  1. #刷题记录--剑指 Offer 07. 重建二叉树

    输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 抓住一点,通过递归进行节点创建时,是按照 前序遍历数组 进行创建的. 根节点,根节点的左 ...

  2. 剑指 Offer 07. 重建二叉树

    链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/ 标签:树.递归 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二 ...

  3. 剑指Offer:重建二叉树【7】

    剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5 ...

  4. 《剑指offer》重建二叉树

    本题来自<剑指offer> 重构二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2 ...

  5. 【Java】 剑指offer(6) 重建二叉树

    本文参考自<剑指offer>一书,代码采用Java语言.  更多:<剑指Offer>Java实现合集 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的 ...

  6. Go语言实现:【剑指offer】重建二叉树

    该题目来源于牛客网<剑指offer>专题. 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4 ...

  7. 剑指OFFER之重建二叉树(九度OJ1385)

    题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...

  8. 剑指offer:重建二叉树

    重建二叉树的前置知识: 0.遍历二叉树: (1)前序遍历:根左右 --> 先访问根节点,再前序遍历左子树,最后前序遍历右子树: (2)中序遍历:左根右 --> 先中序遍历左子树,再访问根节 ...

  9. 剑指Offer 4. 重建二叉树 (二叉树)

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  10. 【剑指offer】重建二叉树

    一.题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...

随机推荐

  1. JSP 与 Servlet 之间的联系,及其语法

    JSP 是什么 JSP 将 Java 代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容.JSP 文件在运行时会被其编译器转换成更原始的 Servlet 代码.JSP ...

  2. .NET静态代码织入——肉夹馍(Rougamo) 发布1.4.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...

  3. rn项目启动时卡在Task :app:checkDebugAarMetadata

    原因是Gradle在下载依赖,打开Android Studio就可以看到右下角在下载.

  4. Jmeter 常用命令 之 CLI模式

    一.Jmeter的非GUI模式命令(即CLI模式command line) 命令: 命令参数 命令释义 -n 设置命令行模式 -t 指定JMX脚本路径参数为:JMX脚本路径,若非当前目录需用全路径或相 ...

  5. idea 中 maven 项目构建 webapp 无 src 目录以及提示无程序包的解决办法

    提示无程序包的解决方法 问题有可能出现在 IDE 版本上,问题版本是 2020.1,升级为 2020.3 后,tomcat 运行就不再提示无程序包的错误 之前尝试的解决办法 maven clean/i ...

  6. Springboot 添加redis

    在项目中常常会用到redis来缓存信息,下面就是如何在Springboot中添加redis 1:在pom.xml中添加依赖 2:配置redis 3:测试使用redis 1:在pom.xml中添加依赖, ...

  7. linux 端口的相关命令

    查看某个端口是否开发 isof -i:端口 说明:如果有显示说明已经开放了,如果没有显示说明没有开放 开放端口之后,查看防火墙是否对端口开放 查询端口号80 是否开启: firewall-cmd -- ...

  8. java.io.StreamCorruptedException: invalid stream header: 00013174

    java.io.StreamCorruptedException: invalid stream header: 00013174 at java.io.ObjectInputStream.readS ...

  9. UE4启动顺序

    GameMode PlayerController Actor Level gameMode , playerController控制pawn , 激活默认相机active camera , getP ...

  10. Centos7安装Docker 及 Docker-compose

    1.安装环境 此处在Centos7进行安装,可以使用以下命令查看CentOS版本 lsb_release -a 在 CentOS 7安装docker要求系统为64位.系统内核版本为 3.10 以上,可 ...