https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/submissions/
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
解题思路:
1. 前序遍历的第一个节点是根节点;
2. 前序遍历的第一个节点在中序遍历中的位置,确定该根节点的左子树节点个数 和子树个数;
3. 通过左子树个数和右子树个数,可以从前序遍历中切割出左子树的前序遍历和右边子树的前序遍历;
4. 分而治之,建立左右子树的根节点;
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {number[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
*/
var buildTree = function(preorder, inorder) {
const buildSubTree = (subPreorder, subInorder) => {
if(subPreorder.length === 0) return null;
const node = new TreeNode(subPreorder[0]);
const inorderIndex = subInorder.findIndex(item => item === node.val);
node.left = buildSubTree(subPreorder.slice(1, inorderIndex+1), subInorder.slice(0,inorderIndex));
node.right = buildSubTree(subPreorder.slice(inorderIndex+1), subInorder.slice(inorderIndex+1));
return node;
}
const rootNode = buildSubTree(preorder,inorder);
return rootNode;
};