前言
数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有
写出高质量代码的潜意识
。
一、问题描述
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 1:
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. 重建二叉树
到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。