日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

vue 倒序遍历数组_【一天一大 lee】从中序与后序遍历序列构造二叉树 (难度:中等)Day20200925...

發(fā)布時間:2025/3/19 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue 倒序遍历数组_【一天一大 lee】从中序与后序遍历序列构造二叉树 (难度:中等)Day20200925... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
20200925

題目:[1]

根據(jù)一棵樹的中序遍歷與后序遍歷構(gòu)造二叉樹。

注意:你可以假設(shè)樹中沒有重復(fù)的元素。

例如,給出:

中序遍歷?inorder?=?[9,3,15,20,7]
后序遍歷?postorder?=?[9,15,7,20,3]

返回如下的二叉樹:

????3
???/?\
??9??20
????/??\
???15???7

拋磚引玉

拋磚引玉

思路

參數(shù):

  • 中序遍歷的數(shù)組
  • 后續(xù)遍歷的數(shù)組

思路

  • 借助后續(xù)遍歷的節(jié)點找到每層子樹的根節(jié)點
  • rootIndex:二叉子樹在后續(xù)遍歷數(shù)組中的位置索引
  • leftIndex:二叉子樹的左子樹在后續(xù)遍歷數(shù)組中的位置索引
  • rightIndex:二叉子樹的右子樹在后續(xù)遍歷數(shù)組中的位置索引

查找根節(jié)點,及當(dāng)前根節(jié)點左右子節(jié)點的邏輯:

  • 后序遍歷數(shù)組倒序遍歷依次作為根節(jié)點
  • 當(dāng)前根節(jié)點的的左右子節(jié)點從中序遍歷數(shù)組中查找:
    • 這個節(jié)點的左節(jié)點在中序遍歷數(shù)組中這個元素的前一位
    • 這個節(jié)點的右節(jié)點在中序遍歷數(shù)組中這個元素的后一位

    深度優(yōu)先搜索(DFS)

    遞歸參數(shù):

    • 左子樹根節(jié)點在 postorder 中的索引
    • 右子樹根節(jié)點在 postorder 中的索引

    終止條件:

    因為后續(xù)遍歷是先遍歷左子樹再遍歷右子樹最后遍歷根節(jié)點, 那么右子樹的索引一定大于左子樹的索引,當(dāng)不滿足是說明節(jié)點遍歷完成,終止遞歸

    /**
    ?*?Definition?for?a?binary?tree?node.
    ?*?function?TreeNode(val)?{
    ?*?????this.val?=?val;
    ?*?????this.left?=?this.right?=?null;
    ?*?}
    ?*/
    /**
    ?*?@param?{number[]}?inorder??中序遍歷
    ?*?@param?{number[]}?postorder?后序遍歷
    ?*?@return?{TreeNode}
    ?*/
    var?buildTree?=?function(inorder,?postorder)?{
    ??let?rootIndex?=?postorder.length?-?1,
    ????map?=?new?Map()
    ??//?記錄在中序遍歷數(shù)組中每個節(jié)點的位置,方便在得到根節(jié)點時查找左右子樹節(jié)點
    ??for?(let?i?=?0;?i?????map.set(inorder[i],?i)
    ??}
    ??function?dfs(leftIndex,?rightIndex)?{
    ????if?(leftIndex?>?rightIndex)?return?null
    ????let?root?=?new?TreeNode(postorder[rootIndex]),
    ??????i?=?map.get(postorder[rootIndex])
    ????rootIndex--
    ????root.right?=?dfs(i?+?1,?rightIndex)
    ????root.left?=?dfs(leftIndex,?i?-?1)
    ????return?root
    ??}
    ??return?dfs(0,?inorder.length?-?1)
    }

    迭代

    倒序遍歷中序遍歷數(shù)組(inorder):

    • 二叉樹的遍歷邏輯變成了:先遍歷右孩子,再遍歷根節(jié)點,最后遍歷左孩子

    倒序遍歷后序遍歷數(shù)組(postorder):

    • 二叉樹的遍歷邏輯變成了:先遍歷根節(jié)點,再遍歷右孩子,最后遍歷左孩子

    那么,倒序遍歷后序遍歷數(shù)組數(shù)組時,兩個相鄰的節(jié)點[a,b],兩個節(jié)點在二叉樹中的關(guān)系:

  • b 是 a 的右子樹上的節(jié)點
  • a 沒有右子樹,并且 b 是與 a 子樹相連的的左子樹上的節(jié)點
  • 實現(xiàn)

    • postorder 中最后一個元素是整個二叉樹的根節(jié)點

    • 倒序遍歷 postorder,inorder:

    • inorder 中先遇到右子樹上的節(jié)點:

      • 不等于上一個生成子樹的節(jié)點,則說明是上一個子樹的右節(jié)點即情況 1,生成子樹追擊到上一個子樹的 right 上
      • 等于上一個生成子樹的節(jié)點,則說明在 inorder 中遍歷到了根節(jié)點,即情況 2,那么 inorder 繼續(xù)遍歷先遇到的應(yīng)該是這個根節(jié)點對應(yīng)子樹的左節(jié)點
    var?buildTree?=?function(inorder,?postorder)?{
    ??let?rootIndex?=?postorder.length?-?1,
    ????root?=?new?TreeNode(postorder[rootIndex]),
    ????//?維護下一次遍歷追擊子樹的最新子樹
    ????queue?=?[root],
    ????inorderIndex?=?inorder.length?-?1

    ??rootIndex--

    ??while?(rootIndex?>=?0)?{
    ????let?node?=?queue[queue.length?-?1],
    ??????nodeVal?=?postorder[rootIndex]
    ????//?不等于上一個生成子樹的節(jié)點,則說明是上一個子樹的右節(jié)點
    ????if?(node.val?!==?inorder[inorderIndex])?{
    ??????node.right?=?new?TreeNode(nodeVal)
    ??????queue.push(node.right)
    ????}?else?{
    ??????//?維護inorder的倒序遍歷索引跳過已經(jīng)生成樹的根節(jié)點
    ??????while?(
    ????????queue.length?&&
    ????????queue[queue.length?-?1].val?===?inorder[inorderIndex]
    ??????)?{
    ????????node?=?queue.pop()
    ????????inorderIndex--
    ??????}
    ??????//?情況?2
    ??????node.left?=?new?TreeNode(nodeVal)
    ??????queue.push(node.left)
    ????}

    ????rootIndex--
    ??}

    ??return?root
    }

    博客: 小書童博客[2]

    每天的每日一題,寫的題解會同步更新到公眾號一天一大 lee 欄目 歡迎關(guān)注留言

    前端小書童

    參考資料

    [1]

    題目:: https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

    [2]

    小書童博客: http://gaowenju.com/

    總結(jié)

    以上是生活随笔為你收集整理的vue 倒序遍历数组_【一天一大 lee】从中序与后序遍历序列构造二叉树 (难度:中等)Day20200925...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。