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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

面試算法之重建二叉樹

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:算法與數(shù)據(jù)結(jié)構(gòu) ? 2019-11-27 15:59 ? 次閱讀

從今天開始,公眾號(hào)陸陸續(xù)續(xù)開始插寫用動(dòng)畫形式展現(xiàn)算法題,如劍指offer、Leedcode里經(jīng)典面試題型,同時(shí)也會(huì)更新數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)、網(wǎng)絡(luò)原理等知識(shí)。

以為無論是面試還是實(shí)際項(xiàng)目,對(duì)算法的要求也非常的嚴(yán)格,所以小鹿盡最大努力把算法還原成動(dòng)畫形式來講解,爭(zhēng)取讓每個(gè)人都能看懂算法、學(xué)會(huì)算法。

1

題目

已知前序遍歷為{1,2,4,7,3,5,6,8},中序遍歷為{4,7,2,1,5,3,8,6},它的二叉樹是怎么樣的?

2

基礎(chǔ)鞏固

根據(jù)上述題目所述,我們已知前序遍歷和中序遍歷,回顧一下,什么是前序遍歷?什么是中序遍歷?

2.1 前序遍歷

前序遍歷一顆二叉樹,首先輸出根節(jié)點(diǎn),然后輸出左子節(jié)點(diǎn),最后輸出右子節(jié)點(diǎn)。

比如,遍歷一下二叉樹:

顏色變深表示遍歷,突出表示輸出

2.2 中序遍歷

中序遍歷一棵二叉樹,首先輸出左子節(jié)點(diǎn),然后輸出輸出根節(jié)點(diǎn),最后右子節(jié)點(diǎn)。

以上邊二叉樹為例,通過中序遍歷輸出。

3

解題思路

既然我們知道了二叉樹如何進(jìn)行前序遍歷和中序遍歷了,那么已知前序遍歷和中序遍歷如何反推二叉樹呢?

那么問題來了,只知道前序遍歷能不能反推二叉樹呢?我們就試一下,比如題目中所述,{1,2,4,7,3,5,6,8},根據(jù)前序遍歷,根、左、右,1 肯定是 根節(jié)點(diǎn),那么一下2,4,7.....哪些是左子節(jié)點(diǎn)呢?左子節(jié)點(diǎn)有幾個(gè)呢?很顯然我們是不知道的,由此可以得出,只知道前序遍歷是不可能反推出二叉樹的,中序遍歷也是如此,自己可以嘗試一下。

那么前序遍歷和中序遍歷可不可以?那我們要試一下,我們上邊通過前序遍歷找到第一個(gè)根節(jié)點(diǎn)就是 1,如圖

中序遍歷{4,7,2,1,5,3,8,6}的規(guī)律又是左、根、右,所以 1 結(jié)點(diǎn)在中序遍歷中為根,它的左邊就是所有左子節(jié)點(diǎn)4,7,2,右邊為所有的右子節(jié)點(diǎn)5,3,8,6。

此時(shí)我們已經(jīng)劃分左右子節(jié)點(diǎn)了,但是左邊的子節(jié)點(diǎn)中哪些又是根節(jié)點(diǎn)呢?我們?cè)倩氐角靶虮闅v中,根據(jù)前序遍歷的特點(diǎn),根、左、右,在從子節(jié)點(diǎn)進(jìn)行劃分,那么 1 結(jié)點(diǎn)中的子節(jié)點(diǎn)誰為根節(jié)點(diǎn)呢?

我們一眼就能看出來,就是 2 結(jié)點(diǎn),那么剩余的 4,7 左右結(jié)點(diǎn)怎么分呢?我們根據(jù)上述再回到中序遍歷,找到 2 根節(jié)點(diǎn),根據(jù)中序遍歷左、根、右的特點(diǎn),找到 2 結(jié)點(diǎn),那左邊的就是左子節(jié)點(diǎn),右邊的就是右子節(jié)點(diǎn),我們可以看到,左邊有兩個(gè)數(shù),正是 4 和 7 結(jié)點(diǎn)。

右邊只有 1 結(jié)點(diǎn),1 結(jié)點(diǎn)我們剛剛說了,是根節(jié)點(diǎn),所以以 2 為根節(jié)點(diǎn)是沒有右子節(jié)點(diǎn)的,剩下的數(shù)字也是同樣的方式區(qū)分,自己可以試一下,動(dòng)手畫一畫。

我們仔細(xì)發(fā)現(xiàn),其實(shí)整個(gè)層層往下,以及左右,都是相同的解決方式,而且大問題可以分解為小問題,我們下意識(shí)就應(yīng)該想起小鹿之前分享過的知識(shí),那就是遞歸,既然是遞歸,就應(yīng)該有終止條件,終止條件就是當(dāng)子節(jié)點(diǎn)為空時(shí),此時(shí)遞歸結(jié)束。

4

測(cè)試用例

我們之前的文章強(qiáng)調(diào)過,手寫代碼之前,一定先把測(cè)試用例想好,為了能夠在手寫代碼的時(shí)候考慮到邊界情況,還為了防止你到時(shí)候面試涂涂改改。

4.1 普通測(cè)試

完全二叉樹、非完全二叉樹。

4.2 特殊測(cè)試

只有左子節(jié)點(diǎn)二叉樹,只有右子節(jié)點(diǎn)、只有一個(gè)結(jié)點(diǎn)的二叉樹 —— 特殊二叉樹測(cè)試。

4.3 輸入測(cè)試

空樹、空指針null、前序和中序不匹配。

5

代碼實(shí)現(xiàn)

JavaScript 版本

Java 版本

C 語言版本

Python 版本

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

    關(guān)注

    23

    文章

    4577

    瀏覽量

    92354
  • 二叉樹
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12296

原文標(biāo)題:動(dòng)畫:面試算法之重建二叉樹

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是默克爾(Merkle Tree)?如何計(jì)算默克爾根?

    01 默克爾的概念 默克爾(Merkle Tree)是一種特殊的二叉樹,它的每個(gè)節(jié)點(diǎn)都存儲(chǔ)了一個(gè)數(shù)據(jù)塊的哈希值。哈希值是一種可以將任意長(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換為固定長(zhǎng)度的字符串的算法,它具有
    的頭像 發(fā)表于 09-30 18:22 ?272次閱讀
    什么是默克爾<b class='flag-5'>樹</b>(Merkle Tree)?如何計(jì)算默克爾根?

    指電極上覆蓋敏感材料的阻值計(jì)算

    覆蓋的敏感材料厚度超出指厚度時(shí)計(jì)算電阻,是否可以視作指電極指間電阻多個(gè)周期串聯(lián)后與超出指厚度部分敏感材料電阻并聯(lián)
    發(fā)表于 07-05 14:48

    康謀分享 | aiSim5仿真場(chǎng)景重建感知置信度評(píng)估(三)

    aiSim5能重建高精度的賽道、車庫(kù)、高速公路等真實(shí)交通場(chǎng)景,用于測(cè)試和訓(xùn)練ADAS/AD系統(tǒng)。通過全局行動(dòng)日志,能將駕駛數(shù)據(jù)轉(zhuǎn)化為場(chǎng)景重建,車道線檢測(cè)算法和多目標(biāo)檢測(cè)算法在仿真與現(xiàn)實(shí)
    的頭像 發(fā)表于 05-08 16:59 ?2338次閱讀
    康謀分享 | aiSim5仿真場(chǎng)景<b class='flag-5'>重建</b>感知置信度評(píng)估(三)

    哈夫曼編碼怎么算 哈夫曼編碼左邊是0還是1

    二叉樹,將出現(xiàn)頻率高的字符用較短的編碼表示,而出現(xiàn)頻率低的字符則用較長(zhǎng)的編碼表示。通過這種方式,可以實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行高效的編碼和解碼。 下面我們將詳細(xì)介紹哈夫曼編碼的算法過程。 統(tǒng)計(jì)字符頻率 在進(jìn)行哈夫曼編碼前,首先需
    的頭像 發(fā)表于 01-30 11:27 ?2254次閱讀

    工業(yè)上常見的高精度主動(dòng)式重建算法

    三維重建目前是最為炙手可熱的領(lǐng)域。攝影測(cè)量或結(jié)構(gòu)光投影技術(shù)可以解決漫反射重建問題,但卻無法有效應(yīng)對(duì)鏡面反射物體(如玻璃、積水、反光物體和汽車車身)等的重建挑戰(zhàn)。
    發(fā)表于 01-05 10:46 ?397次閱讀
    工業(yè)上常見的高精度主動(dòng)式<b class='flag-5'>重建</b><b class='flag-5'>算法</b>

    十大排序算法總結(jié)

    排序算法是最經(jīng)典的算法知識(shí)。因?yàn)槠鋵?shí)現(xiàn)代碼短,應(yīng)該廣,在面試中經(jīng)常會(huì)問到排序算法及其相關(guān)的問題。一般在面試中最??嫉氖强焖倥判蚝蜌w并排序等基
    的頭像 發(fā)表于 12-20 10:39 ?1048次閱讀

    決策:技術(shù)全解與案例實(shí)戰(zhàn)

    決策算法是機(jī)器學(xué)習(xí)領(lǐng)域的基石之一,其強(qiáng)大的數(shù)據(jù)分割能力讓它在各種預(yù)測(cè)和分類問題中扮演著重要的角色。
    的頭像 發(fā)表于 12-13 09:49 ?1077次閱讀
    決策<b class='flag-5'>樹</b>:技術(shù)全解與案例實(shí)戰(zhàn)

    NeurIPS 2023 | 清華ETH提出首個(gè)值化光譜重建算法

    壓縮重建工具包 BiSCI 內(nèi),該工具包支持八類最主要的值網(wǎng)絡(luò),歡迎大家來使用。同時(shí),我們還將 BiSRNet 嵌入到了我們之前開發(fā)的光譜重建工具箱 MST 當(dāng)中。目前 MST 工具包已支持超過 12 類深度學(xué)習(xí)
    的頭像 發(fā)表于 12-03 20:20 ?599次閱讀
    NeurIPS 2023 | 清華ETH提出首個(gè)<b class='flag-5'>二</b>值化光譜<b class='flag-5'>重建</b><b class='flag-5'>算法</b>

    堆的實(shí)現(xiàn)思路

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

    二叉樹的定義

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

    OP-TEE安全存儲(chǔ)安全文件的格式

    時(shí),默認(rèn)情況下, 加密后的數(shù)據(jù)會(huì)被保存在/data/tee目錄中。 安全存儲(chǔ)功能使用 二叉樹的方式來 保存加密后的文件。 當(dāng)?shù)谝淮问褂冒踩鎯?chǔ)功能創(chuàng)建用于保存敏感數(shù)據(jù)的安全文件時(shí),OP-TEE將會(huì)在/data/tee目錄中生成兩個(gè)文件:dirf.db文件和以數(shù)字命名的文件。 dirf.db文
    的頭像 發(fā)表于 11-21 11:49 ?648次閱讀
    OP-TEE安全存儲(chǔ)安全文件的格式

    什么情況下需要布隆過濾器

    , gmail等郵箱垃圾郵件過濾功能 這幾個(gè)例子有一個(gè)共同的特點(diǎn):如何判斷一個(gè)元素是否存在一個(gè)集合中? 常規(guī)思路 數(shù)組 鏈表 、平衡二叉樹、Trie Map (紅黑) 哈希表 雖然上面描述的這幾種數(shù)據(jù)結(jié)構(gòu)配合常見的排序、
    的頭像 發(fā)表于 11-11 11:37 ?602次閱讀
    什么情況下需要布隆過濾器

    紅黑的特點(diǎn)及應(yīng)用

    比起理解紅黑的原理,更重要的是理解紅黑的應(yīng)用場(chǎng)景,因?yàn)槟承?yīng)用場(chǎng)景的需要,紅黑才會(huì)應(yīng)運(yùn)而生。 紅黑的特點(diǎn): 插入,刪除,查找都是O(logn)的復(fù)雜度。 紅黑
    的頭像 發(fā)表于 11-10 11:16 ?667次閱讀
    紅黑<b class='flag-5'>樹</b>的特點(diǎn)及應(yīng)用

    模型算法總結(jié)

    本文將繼續(xù)修煉回歸模型算法,并總結(jié)了一些常用的除線性回歸模型之外的模型,其中包括一些單模型及集成學(xué)習(xí)器。 保序回歸、多項(xiàng)式回歸、多輸出回歸、多輸出K近鄰回歸、決策回歸、多輸出決策回歸
    的頭像 發(fā)表于 11-03 10:39 ?563次閱讀
    模型<b class='flag-5'>算法</b>總結(jié)

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

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