难度:中等
problem
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例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]
solution
先序遍历第一个元素是整个二叉树的根节点,找到这个根节点。
在中序遍历中找到根节点,根节点在中序遍历中将二叉树分为了左右两边。
再在左边的二叉树中找到根节点,根据中序遍历将其分为左右两边,右边的二叉树也同理,递归。
code
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
|
var buildTree = function(preorder, inorder) { if (preorder.length <= 0) return null; let nodeVal = preorder[0]; let node = new TreeNode(nodeVal); let nodeIndexOfInorder = inorder.indexOf(nodeVal); let leftInorder = inorder.slice(0, nodeIndexOfInorder); let rightInorder = inorder.slice(nodeIndexOfInorder + 1); let leftPreorder = preorder.slice(1, 1 + nodeIndexOfInorder); let rightPreorder = preorder.slice(1 + nodeIndexOfInorder); node.left = buildTree(leftPreorder, leftInorder); node.right = buildTree(rightPreorder, rightInorder); return node; };
|