1. 程式人生 > 實用技巧 >LeetCode 105. 從前序與中序遍歷序列構造二叉樹

LeetCode 105. 從前序與中序遍歷序列構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹
注意:
你可以假設樹中沒有重複的元素。

例如,給出

前序遍歷 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;
};