[JS]前序遍歷和中序遍歷的結(jié)果還原一棵二叉樹,很經(jīng)典的問題

/**
 * 前序遍歷和中序遍歷的結(jié)果還原一棵二叉樹,很經(jīng)典的問題
 */
function TreeNode(val) {
    this.val = val;
    this.left = this.right = null;
}

/**
 * 根據(jù)前序和中序的結(jié)果還原二叉樹
 * @param {*} pre 前序遍歷的序列
 * @param {*} vin 中序遍歷的序列
 */
function buildTree(pre, vin){
    // console.log('=======start=========')
    if(pre.length == 0 || vin.length == 0){
        return null
    }
    // 1)根據(jù)前序遍歷的第一個(gè)節(jié)點(diǎn)就是原二叉樹的根節(jié)點(diǎn),求得根節(jié)點(diǎn)是 1
    var index = vin.indexOf(pre[0]); //獲取根結(jié)點(diǎn)索引
   
    // 2)根據(jù)中序遍歷,根節(jié)點(diǎn)左邊就是左子樹的節(jié)點(diǎn),求得左樹的范圍 [4,7,2]
    var leftTree = vin.slice(0, index); //左樹的范圍
    
    var rightTree = vin.slice(index+1); //右樹的范圍
    

    //新建二叉樹
    var node = new TreeNode(vin[index]) //根節(jié)點(diǎn)以及后續(xù)迭代的各節(jié)點(diǎn)
    node.left = buildTree(pre.slice(1, index+1), leftTree)
    node.right = buildTree(pre.slice(index+1), rightTree);
  
    return node;
}


//測(cè)試用例
// buildTree([1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6])
console.log('最終還原的二叉樹為:',buildTree([1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]))

最終還原的二叉樹為: TreeNode {
val: 1,
right: TreeNode {
val: 3,
right: TreeNode { val: 6, right: null, left: [TreeNode] },
left: TreeNode { val: 5, right: null, left: null }
},
left: TreeNode {
val: 2,
right: null,
left: TreeNode { val: 4, right: [TreeNode], left: null }
}
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容