LeetCode 105. 從前序與中序遍歷序列構造二叉樹
阿新 • • 發佈:2020-10-22
根據一棵樹的前序遍歷與中序遍歷構造二叉樹
注意:
你可以假設樹中沒有重複的元素。
例如,給出
前序遍歷 preorder =[3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
3
/ \
9 20
/ \
15 7
遞迴
/** * @param {number[]} preorder * @param {number[]} inorder * @return {TreeNode} */ var buildTree = function (preorder, inorder) { if (preorder.length !== inorder.length) { return null; } const map = {}; for (let i = 0; i < inorder.length; i++) { map[inorder[i]] = i; } return buildSubtree(preorder, inorder, 0, preorder.length - 1, map) }; /** * @param: preorder * @param: inorder * @param: start `中序遍歷`的左子樹開始位置 * @param: end `中序遍歷`的右子樹結束位置 * @param: map */ var buildSubtree = function (preorder, inorder, start, end, map) { // start === end 時為葉子節點, // start > end 表示 null if (start > end) { return null; } let val = preorder.shift(); // 前序遍歷找出根節點 let root = new TreeNode(val); // 中序遍歷對應的根節點 let index = map[val]; // 遞迴全部左子樹 root.left = buildSubtree(preorder, inorder, start, index - 1, map); // 遞迴全部左子樹 root.right = buildSubtree(preorder, inorder, index + 1, end, map); return root; };