劍指offer·JS版 | 重建二叉樹

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。javascript

解法 1: 遞歸

首先前序/後序遍歷 + 中序遍歷能夠重建二叉樹。題目考察的就是前序+中序來重建二叉樹,後序+中序的思路是相似的。前端

例子與思路

假設有二叉樹以下:java

1
   / \
  2   3
 / \
4   5

它的前序遍歷的順序是:1 2 4 5 3。中序遍歷的順序是:4 2 5 1 3node

由於前序遍歷的第一個元素就是當前二叉樹的根節點。那麼,這個值就能夠將中序遍歷分紅 2 個部分。在以上面的例子,中序遍歷就被分紅了 4 2 53 兩個部分。4 2 5就是左子樹,3就是右子樹。git

最後,根據左右子樹,繼續遞歸便可。github

專一前端與算法的系列乾貨分享,歡迎關注(¬‿¬):
「微信公衆號: 心譚博客」| xxoo521.com | GitHub

代碼實現

// ac地址:https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6
// 原文地址:https://xxoo521.com/2019-12-21-re-construct-btree/

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */

/**
 * @param {TreeNode} pre
 * @param {TreeNode} vin
 * @return {TreeNode}
 */
function reConstructBinaryTree(pre, vin) {
    if (!pre.length || !vin.length) {
        return null;
    }

    const rootVal = pre[0];
    const node = new TreeNode(rootVal);

    let i = 0; // i有兩個含義,一個是根節點在中序遍歷結果中的下標,另外一個是當前左子樹的節點個數
    for (; i < vin.length; ++i) {
        if (vin[i] === rootVal) {
            break;
        }
    }

    node.left = reConstructBinaryTree(pre.slice(1, i + 1), vin.slice(0, i));
    node.right = reConstructBinaryTree(pre.slice(i + 1), vin.slice(i + 1));
    return node;
}

專一前端與算法的系列乾貨分享,歡迎關注(¬‿¬)算法

相關文章
相關標籤/搜索