对应LeetCode上的题目:面试题07. 重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例子
1 2 3 4 5 6 7 8 9 10 11
| 给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
|
解法:二叉树的前序遍历和中序遍历
二叉树的前序遍历中,第一个数字是二叉树的根节点。在中序遍历中,根节点位于序列的中间,即根节点的左边是左子树节点的值,右边是右子树节点的值。
由前序遍历 [3,9,20,15,7]
可知,3
是根节点。中序遍历 [9,3,15,20,7]
可知,根节点 3
的左边是左子树节点 9
,右边是右子树节点 15
,20
,7
。所以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
var buildTree = function(preorder, inorder) { if(!preorder.length || !inorder.length) { return null }
const rootVal = preorder[0] const node = new TreeNode(rootVal)
let i = 0; for(; i < inorder.length; ++i) { if(inorder[i] === rootVal) { break; } }
node.left = buildTree(preorder.slice(1, i+1), inorder.slice(0, i)) node.right = buildTree(preorder.slice(i+1), inorder.slice(i + 1))
return node };
|
知识扩展