精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Offer系列面試題0:重建二叉樹

算法與數(shù)據(jù)結構 ? 來源:圖解面試算法 ? 2020-07-09 15:03 ? 次閱讀

今天分享的題目來源于 LeetCode 上的劍指 Offer 系列面試題07. 重建二叉樹,近半年在微軟面試環(huán)節(jié)出現(xiàn)過 2 次,屬于中高難度的算法題!

一、題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數(shù)字。

例如,給出

前序遍歷preorder=[3,9,20,15,7] 中序遍歷inorder=[9,3,15,20,7]

返回如下的二叉樹:

3 / 920 / 157

限制:

0 <= 節(jié)點個數(shù) <= 5000

二、題目解析

首先,我們先來復習一下前序遍歷、中序遍歷。(在下方的視頻中分布講解)

前序遍歷

二叉樹的前序遍歷順序是:根節(jié)點、左子樹、右子樹,每個子樹的遍歷順序同樣滿足前序遍歷順序。

中序遍歷

二叉樹的中序遍歷順序是:左子樹、根節(jié)點、右子樹,每個子樹的遍歷順序同樣滿足中序遍歷順序。

復習過后,我們可以得出以下結論:

在二叉樹的前序遍歷序列中,第一個數(shù)字總是樹的根結點的值;

在二叉樹的中序遍歷序列中,根結點的值在序列的中間,左子樹的結點的值位于根結點的值的左邊,而右子樹的結點的值位于根結點的值的右邊

以本題的序列為例,前序遍歷序列的第一個數(shù)字 3 就是根結點的值,在中序遍歷序列,找到根結點值的位置。根據(jù)中序遍歷特點,在根結點的值 3前面的數(shù)字都是左子樹結點的值,在根結點的值 3后面的數(shù)字都是右子樹結點的值。

二叉樹很重要的一個性質是遞歸,在找到了左子樹、右子樹的前序遍歷序列和中序遍歷序列后,我們可以按照同樣的方法去確定子左子樹和子右子樹的構建。

具體的代碼編寫思路如下(來源于 Krahets's Blog):

遞推參數(shù):前序遍歷中根節(jié)點的索引pre_root_idx、中序遍歷左邊界in_left_idx、中序遍歷右邊界in_right_idx。

終止條件:當in_left_idx > in_right_idx,子樹中序遍歷為空,說明已經(jīng)越過葉子節(jié)點,此時返回 null 。

遞推工作:

建立根節(jié)點 root :值為前序遍歷中索引為pre_root_idx的節(jié)點值。

搜索根節(jié)點 root 在中序遍歷的索引 i :為了提升搜索效率,本題解使用哈希表map預存儲中序遍歷的值與索引的映射關系,每次搜索的時間復雜度為 O(1)。

構建根節(jié)點root的左子樹和右子樹:通過調用 recursive()方法開啟下一層遞歸。

左子樹:根節(jié)點索引為 pre_root_idx + 1 ,中序遍歷的左右邊界分別為 in_left_idx 和 i - 1。

右子樹:根節(jié)點索引為 i - in_left_idx + pre_root_idx + 1(即:根節(jié)點索引 + 左子樹長度 + 1),中序遍歷的左右邊界分別為 i + 1 和 in_right_idx。

返回值:返回root,含義是當前遞歸層級建立的根節(jié)點root為上一遞歸層級的根節(jié)點的左或右子節(jié)點。

三、動畫描述

四、圖片描述

五、參考代碼

classSolution{ //在中序序列中查找與前序序列首結點相同元素的時候,如果使用while循環(huán)去一個個找效率很慢 //這里我們借助數(shù)據(jù)結構HashMap來輔助查找,在開始遞歸之前把所有的中序序列的元素和它們所在的下標存到一個map中,這樣查找的時間復雜度是O(logn) HashMapmap=newHashMap<>(); //保留的前序遍歷 int[]preorder; publicTreeNodebuildTree(int[]preorder,int[]inorder){ this.preorder=preorder; //在開始遞歸之前把所有的中序序列的元素和它們所在的下標存到一個map中 for(inti=0;iin_right_idx){ returnnull; } //root_idx是在前序里面的 TreeNoderoot=newTreeNode(preorder[pre_root_idx]); //通過map,根據(jù)前序的根節(jié)點的值,在中序中獲取當前根的索引 intidx=map.get(preorder[pre_root_idx]); //左子樹的根節(jié)點就是左子樹的(前序遍歷)第一個,就是+1,左邊邊界就是left,右邊邊界是中間區(qū)分的idx-1 root.left=recursive(pre_root_idx+1,in_left_idx,idx-1); //右子樹的根,就是右子樹(前序遍歷)的第一個,就是當前根節(jié)點加上左子樹的數(shù)量 root.right=recursive(pre_root_idx+(idx-1-in_left_idx+1)+1,idx+1,in_right_idx); returnroot; } }

這段代碼的一個難點就是root.left與root.right,我這里抽離出來詳細解釋一下。

1、root.left

2、root.right

六、復雜度分析

時間復雜度

時間復雜度為 O(N)。

空間復雜度

空間復雜度為 O(N)。

七、相關標簽

遞歸

哈希表

八、參考來源

1、https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/solution/mian-shi-ti-07-zhong-jian-er-cha-shu-di-gui-fa-qin/ 題解區(qū)

2、https://krahets.gitee.io/views/sword-for-offer/2020-02-24-sword-for-offer-07.html

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)字
    +關注

    關注

    1

    文章

    1691

    瀏覽量

    51191
  • 二叉樹
    +關注

    關注

    0

    文章

    74

    瀏覽量

    12283

原文標題:面試字節(jié)跳動時,我竟然遇到了原題……

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么是守護線程?守護線程的底層原理和使用示例

    大家好,今天這篇文章來梳理一下有關守護線程的相關問題,這也是之前曾經(jīng)有被問到過的面試題,在此之前我們先看一看守護線程的使用示例。
    的頭像 發(fā)表于 01-05 11:01 ?1183次閱讀
    什么是守護線程?守護線程的底層原理和使用示例

    經(jīng)典Linux面試題總結

    絕對路徑用什么符號表示?當前目錄、上層目錄用什么表示?主目錄用什么表示? 切換目錄用什么命令?
    的頭像 發(fā)表于 01-04 11:01 ?297次閱讀

    總結常見電路面試題

    輸入信號應提前時鐘上升沿(如上升沿有效)T時間到達芯片,這個T就是建立時間-Setup time。如不滿足setup time,這個數(shù)據(jù)就不能被這一時鐘打入觸發(fā)器,只有在下一個時鐘上升沿,數(shù)據(jù)才能被打入觸發(fā)器。
    的頭像 發(fā)表于 01-02 16:03 ?314次閱讀

    堆的實現(xiàn)思路

    什么是堆? 堆是一種 基于樹結構的數(shù)據(jù)結構,它是一棵二叉樹 ,具有以下兩個特點: 堆是一個完全二叉樹,即除了最后一層,其他層都是滿的,最后一層從左到右填滿。 堆中每個節(jié)點都滿足堆的特性,即父節(jié)點的值
    的頭像 發(fā)表于 11-24 16:02 ?331次閱讀
    堆的實現(xiàn)思路

    二叉樹的定義

    型結構 是一類重要的 非線性數(shù)據(jù)結構 ,其中以二叉樹最為常用,直觀來看,是以分支關系定義的層次結構。型結構在客觀世界中廣泛存在,比
    的頭像 發(fā)表于 11-24 15:57 ?1034次閱讀
    <b class='flag-5'>樹</b>與<b class='flag-5'>二叉樹</b>的定義

    求解三極管電路的輸出電位值

    面試題的選擇當然是偶個人覺得比較好的,所以肯定有一定的主觀性。咱以前為公司招聘時也出過題目,都是最簡單的(例如,給一個“場效應管驅動電磁繼電器”電路,讓你描述一些元件的作用),至于工程師能力與經(jīng)驗
    的頭像 發(fā)表于 11-20 17:38 ?840次閱讀
    求解三極管電路的輸出電位值

    硬件工程師經(jīng)典面試題詳解

    硬件工程師經(jīng)典面試題詳解
    的頭像 發(fā)表于 11-20 15:08 ?1162次閱讀
    硬件工程師經(jīng)典<b class='flag-5'>面試題</b>詳解

    Feign的超時時間如何設置呢?

    今天來聊一聊前段時間看到的一個面試題,也是在實際項目中需要考慮的一個問題,F(xiàn)eign 的超時時間如何設置?
    的頭像 發(fā)表于 11-15 10:22 ?1023次閱讀
    Feign的超時時間如何設置呢?

    面試題:malloc(0)會發(fā)生什么?

    至此,我們就可以根據(jù)這些計算出使用 glibc 在我們的電腦上運行時 malloc 出的最小空間的大小了。計算完后,還可以根據(jù) malloc_usable_size 判斷自己的計算是否正確,樣例代碼如下
    的頭像 發(fā)表于 10-31 16:27 ?391次閱讀
    <b class='flag-5'>面試題</b>:malloc(<b class='flag-5'>0</b>)會發(fā)生什么?

    為什么MySQL索引要用B+tree?

    紅黑是一種特化的 AVL(平衡二叉樹),都是在進行插入和刪除操作時通過特定操作保持二叉查找的平衡; 若一棵
    發(fā)表于 10-30 14:41 ?170次閱讀

    30道Linux面試題總結

    如果你是一名開發(fā)人員、系統(tǒng)管理員,或是僅僅對 Linux 感興趣,那么這個列表是為你準備的。它包含了類 Unix 系統(tǒng)管理或編程職位面試中涉及 Linux 相關的所有常見問題。
    發(fā)表于 10-27 15:29 ?1911次閱讀
    30道Linux<b class='flag-5'>面試題</b>總結

    c語言面試題集(完整版)

    電子發(fā)燒友網(wǎng)站提供《c語言面試題集(完整版).pdf》資料免費下載
    發(fā)表于 10-20 11:20 ?2次下載
    c語言<b class='flag-5'>面試題</b>集(完整版)

    mysql經(jīng)典面試題及答案

    char、varchar的區(qū)別是什么? varchar是變長而char的長度是固定的。如果你的內容是固定大小的,你會得到更好的性能。
    的頭像 發(fā)表于 10-20 09:47 ?911次閱讀
    mysql經(jīng)典<b class='flag-5'>面試題</b>及答案

    文件系統(tǒng)-多二叉樹的轉化

    在這一節(jié)中,我們來學習如何使用程序來實現(xiàn)一棵文件。在上一節(jié)中,我們了解到使用文件的方式來整合計算機中所有的資源,而這一棵文件則是一棵多
    的頭像 發(fā)表于 10-11 10:06 ?768次閱讀
    文件系統(tǒng)-多<b class='flag-5'>叉</b><b class='flag-5'>樹</b>與<b class='flag-5'>二叉樹</b>的轉化

    數(shù)據(jù)結構面試二叉樹相關操作

    根據(jù)前序可知根結點為1; 根據(jù)中序可知 4 7 2 為根結點 1 的左子樹和 8 5 9 3 6 為根結點 1 的右子樹; 遞歸實現(xiàn),把 4 7 2 當做新的一棵和 8 5 9 3 6 也當做新的一棵; 在遞歸的過程中輸出后序。
    發(fā)表于 10-10 14:50 ?182次閱讀
    數(shù)據(jù)結構<b class='flag-5'>面試</b>之<b class='flag-5'>二叉樹</b>相關操作