剑指 Offer 07. 重建二叉树 🎃

简介: 剑指 Offer 07. 重建二叉树 🎃

前言

数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有写出高质量代码的潜意识

一、问题描述

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:

image.png

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

限制:

  • 0 <= 节点个数 <= 5000

二、思路讲解

就假设我们现在有这样一棵树

1 
 / \ 
2   3 
   / \
  4   5
  • 那么它的前序遍历结果为12345, 前序遍历的第一个就是根节点,其值为1
  • 它的中序遍历结果为21435,更据刚才我们找到的根节点,那么根结点的左侧一定是 2,根节点的右侧一定是由 435组成的一棵树,同样,对于435这棵树我们可以重复上述的步骤,得到其根节点,左子树,右子树。

写了很多注释,应该多看两边就清晰了。

var buildTree = function(preorder, inorder) {
    if(!preorder.length) return null
    let rootValue = preorder[0] // 根节点的值
    const root = new TreeNode(rootValue) //  结果要返回链表,所以我们创建一个根节点
    const index = inorder.indexOf(rootValue) // index 左侧为 根节点的左树 右侧为根节点的右树
    // 注意slice方法左闭右开  例如 [1,2,3].slice(1,2) -> [2]
    // preorder.slice 方法 [1,index+1) 表示 从第二个元素往后算index个元素为其左树的先序遍历
    // inorder.slice [0,index) 表示在下标为index之前的所有元素 为其左树的中序遍历
    root.left = buildTree(preorder.slice(1,index+1),inorder.slice(0,index))
    root.right = buildTree(preorder.slice(index+1),inorder.slice(index+1))
    return root
};

后续

好了,本篇 剑指 Offer 07. 重建二叉树到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。


相关文章
|
9月前
剑指 Offer 24:反转链表
剑指 Offer 24:反转链表
45 1
|
9月前
剑指 Offer 10- II:青蛙跳台阶问题
剑指 Offer 10- II:青蛙跳台阶问题
60 1
|
9月前
剑指 Offer 07:重建二叉树
剑指 Offer 07:重建二叉树
44 0
|
9月前
剑指 Offer 49:丑数
剑指 Offer 49:丑数
48 0
|
9月前
剑指 Offer 55 - II:平衡二叉树
剑指 Offer 55 - II:平衡二叉树
55 0
|
9月前
|
Java C++ Python
剑指 Offer 58 - II:左旋转字符串
剑指 Offer 58 - II:左旋转字符串
80 0
|
C++ 容器
剑指 Offer 58 - II. 左旋转字符串(3种方法)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 请定义一个函数实现字符串左旋转操作的功能。 比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
78 0