今天带来的是Leetcode上的一个经典题:从前序与中序遍历序列构造二叉树
原题干:node
/**算法
- Definition for a binary tree node.
- function TreeNode(val) {
- this.val = val;
- this.left = this.right = null;
- }
*/
/**ui
- @param {number[]} preorder
- @param {number[]} inorder
- @return {TreeNode}
*/
input:this
- 前序遍历
preorder = [3,9,20,15,7]
- 中序遍历
inorder = [9,3,15,20,7]
output: 树的根节点spa
条件:
树的结构为:{ val, left, right }code
下面是我解决这个题的时候的思路blog
这个题目考察的是对树结构和树遍历的熟悉程度。树的前序,中序遍历的结构以下图:递归
能够看出,经过前序遍历能够肯定根节点,再经过中序遍历和根节点的位置能够肯定出左子树和右子树。另外左子树的前序遍历和中序遍历的顺序跟在其父树中的顺序同样。ip
所以能够肯定有一种递归解法。肯定根和左右子树,递归用左右子树的前序和中序顺序去获取左右子树。leetcode
var buildTree = function(preorder, inorder) { if (preorder.length === 0) { return null } let leftTreeLen = 0 let rightTreeLen = 0 let tag = 1 for (let i = inorder.length - 1; i >= 0; i--) { if (inorder[i] !== preorder[0]) { if (tag) { rightTreeLen++ } else { leftTreeLen++ } } else if (inorder[i] === preorder[0]) { tag = false } } let root = new TreeNode(preorder[0]) // 根 root.left = buildTree(preorder.slice(1, 1 + leftTreeLen), inorder.slice(0, leftTreeLen)) root.right = buildTree(preorder.slice(1 + leftTreeLen), inorder.slice(-rightTreeLen)) return root };
晚上再更新一次,目测是有非递归的解法的。
本期算法小分享就到这里咯(leetcode正在作完探索里的中级。)若是有什么意见或者想法欢迎在评论区和我交流