算法題--二叉樹重建

問題:

根據二叉樹的前序遍歷{1,2,4,7,3,5,6,8}和中序遍歷{4,7,2,1,5,3,8,6},從新構建二叉樹。ui

思路:

遍歷順序:spa

  • 前序遍歷:首先訪問根,再先序遍歷左子樹,最後先序遍歷右子樹。
  • 中序遍歷:首先中序遍歷左子樹,再訪問根,最後中序遍歷右子樹。
  • 後序遍歷:首前後序遍歷左子樹,再後序遍歷右子樹,最後訪問根。

因此有了前序遍歷和中序遍歷必定能夠肯定惟一的二叉樹,前序遍歷的pre[0]就是根節點的位置,因此先在中序遍歷中找到根節點的位置,而後根節點的左邊就是中序遍歷的左子樹,右邊就是中序遍歷的右子樹,左子樹和右子樹一樣也是中序遍歷,使用遞歸獲得最終結果。code

代碼實現:

function reConstructBinaryTree(pre, vin) {
    if (!pre || pre.length === 0) {
        return;
    }
    var treeNode = {
        root: pre[0]
    }
    for(var i = 0; i < pre.length; i++) {
        if (vin[i] === pre[0]) {
            // left遞歸體中的兩個參數,是前序變量的左子樹和終須變量的左子樹
            treeNode.left = reConstructBinaryTree(pre.slice(1, i+1), vin.slice(0, i));
            // right遞歸體中的兩個參數,是前序變量的右子樹和終須變量的右子樹
            // 由於第i個是根節點,須要跳過
            treeNode.right = reConstructBinaryTree(pre.slice(i+1),vin.slice(i+1));
        }
    }
    return treeNode;
    console.log(treeNode)
}
複製代碼

思考:

若是給定中序遍歷和後序遍歷,一樣能夠重建二叉樹,只不過由前序遍歷的第一項是根節點變成了後序遍歷的最後一項是根節點。一樣找到中序遍歷中根節點的位置,而後進行遞歸。遞歸

代碼實現:

function reConstructBinaryTree(vin, pos) {
    if (!pos || pos.length === 0) {
        return;
    }
    var treeNode = {
        root: pos[pos.length-1]
    }
    for(var i = 0; i < pos.length; i++) {
        if (vin[i] === pos[pos.length-1]) {
            // left遞歸體中的兩個參數,是前序變量的左子樹和終須變量的左子樹
            treeNode.left = reConstructBinaryTree(pre.slice(1, i+1), vin.slice(0, i));
            // right遞歸體中的兩個參數,是前序變量的右子樹和終須變量的右子樹
            // 由於第i個是根節點,須要跳過
            treeNode.right = reConstructBinaryTree(pre.slice(i+1),vin.slice(i+1));
        }
    }
    return treeNode;
    console.log(treeNode)
}
複製代碼
相關文章
相關標籤/搜索