看了這篇文章,再也不怕面試問樹了(文末福利)

2021-03-02 戰IT

在寫完了所有線性數據結構之後,今天開啟非線性數據結構系列。

我們今天先來看,什麼是「樹」。

樹是由頂點和邊組成的且不存在環的數據結構。作為一個應用非常廣的數據結構,不僅在工作中常用,在面試中也常考。

一是因為樹的結構天然決定了它和遞歸聯繫緊密,很多樹相關的算法題都非常適合用遞歸來解;

二是因為它的難度介於鍊表和圖之間,非常適合在 45 分鐘的面試裡進行考察,所以一場面試中遇到兩三輪問樹都是再正常不過的了。

本文先來講樹的基礎內容,分為以下小節,每個小節開頭都會有思維導圖和對應的 Leetcode 算法題喲~

樹的所有概念
a. 樹的三大特點
b. 樹的五大品種
c. 高度和深度看樹的角度
a. 三種 DFS 遍歷方式
b. 兩種 BFS 遍歷方式
c. 四種視圖

鑑於樹相關的內容太多,而且又是面試重點內容,之後會有文章再專門來講樹有關的解題思路以及最常用的二叉搜索樹,大家敬請期待~

簡介

其實數據結構裡的「樹」和我們現實世界裡的樹挺像的,只不過倒過來了嘛,根朝上。

比如:

在這片森林裡,最常用的還是「二叉樹」。

二叉樹,是由很多個 TreeNode 構成的這種樹形的數據結構,

class TreeNode {
    int value;
    TreeNode left;
    TreeNode right;
}

就像鍊表中的 ListNode。

二叉樹並不一定非得是「二叉」的,而是說每個節點最多有兩個孩子,叫 left 和 right,但也可以沒有。

當每個節點都只有一個孩子的時候,就退化成了鍊表。

所以鍊表就是一棵特殊的樹,而樹是一個特殊的圖。

金融裡的二叉樹

大家知道我是金融背景的,所以我最開始了解二叉樹是在金融工程課程中給衍生品定價,這裡也簡單梳理下,不感興趣的小夥伴可以跳過這一段。

在金融工程裡,二叉樹是用來在風險中性世界裡給期權定價使用的模型。

比如這是一個股價二叉樹,其實就是我們把二叉樹放倒了看嘛。

有些小夥伴會發現,這裡的節點好像少了很多,沒錯,因為我們讓股價每次上漲和下跌的幅度保持不變,所以到第 n 層最多有 n 個節點,而不會像普通的二叉樹一樣按照等比序列增長。

上圖是兩期的二叉樹,那麼最簡單的一期的二叉樹定價模型表示為:

我們假設當前股票的價格為 S,那我們想知道未來某個時刻比如 t 時刻的價格,股價有可能上漲也有可能下跌,還可能不變呢。

在該模型裡我們就抽象成兩種可能性,一種是上漲,一種是下跌,所以可以用二叉樹來表示。

假設股票價格會有 p 的概率上漲至 uS,
有 1-p 的概率下跌至 dS.

這裡的 p 並不是在真實世界裡股票上漲的概率,而是一個在風險中性世界裡的上漲概率,所以

股票現在的價格就是未來某時刻的無風險收益的折現

即:

這就是最簡單的二叉樹定價模型。

那我們言歸正傳。

樹的所有概念 1. 三大特點

樹的三大特點是:

如果把樹看成一個無向圖,那麼它是一個連通圖 connected graph.

樹的節點個數和邊的個數之間的關係是固定的。如果樹上有 n 個 node,那麼它有 n-1 條邊。因為除了根節點,其他的節點都會有一條邊指向它。

2. 樹的品種

2.1 平衡二叉樹 Balanced Binary Tree:

定義:對於這棵樹裡的每個節點,它的左子樹和右子樹的高度差不大於 1。

這裡要注意,是對於每個節點,而不只是對於根結點。

比如左邊這棵樹就不是平衡二叉樹,右邊的才是。

那麼大名鼎鼎的 AVL-Tree 就是平衡二叉樹,準確說是自平衡二叉查找樹。

那什麼是二叉查找樹呢?

2.2 二叉查找樹 Binary Search Tree

對二叉查找樹,最重要的性質就是:

在做中序遍歷時,這個序列是一個升序序列。

當你在做二叉查找樹的算法題沒有思路時,可以想想這個性質,很多題目都會迎刃而解。

2.3 完全二叉樹 Complete Binary Tree:

定義:除了最後一層,其他層都是滿的,那麼最後一層的節點要靠左排列且中間不允許有氣泡。

比如左邊不是完全二叉樹,右邊的是。

比如堆就是一個完全二叉樹,還不了解堆的基本操作的,公眾號內回復「堆」獲取文章複習喲~

那麼完全二叉樹的最大的好處就是因為它排列緊密沒有氣泡,所以可以用數組來存儲,這樣就大大節省了內存空間。

2.4 完美二叉樹 Perfect Binary Tree

完美二叉樹比完全二叉樹的定義更加嚴格,包括最後一層,每一層的節點都要是滿的,畢竟是追求完美的嘛。

所以我們如果知道了層數,就知道了它有多少個節點,也就是一個等比數列求和。

2.5 完滿二叉樹 Full Tree

定義:對於這棵樹的每個節點而言,要麼有 0 個孩子,要麼有 2 個孩子。

大家不要輕視這些概念哦,很多算法題都會直接考察,在本節的思維導圖裡也附帶了 Leetcode 對應的題目,電面時很喜歡考哦~

3. 高度和深度

樹的高度 height 和深度 depth 是兩個非常重要的概念,比如 Leetcode 104 和 111 就是專門求樹的高度的。

而這兩個概念是相反方向的,大體上呢,

高度 Height

定義:從該節點,到以該節點為根節點的這棵樹的最遠的葉子結點的最長距離。

核心是,從該節點到最遠葉子節點,有幾條邊。

這個概念在分析時空複雜度時非常常用,比如在樹上做一個遞歸複雜度是 O(height)。

為什麼呢?

因為這個距離決定了在 call stack 上有多少層。

深度 Depth

這個概念用的比較少,是和高度方向相反的概念。

看樹的角度

俗話說,橫看成嶺側成峰,這句話用在這裡太合適不過了。

對於樹的幾種遍歷方式想必大家都不陌生,這就是我所說的「嶺」;

而還有一種面試常考題是問 left/right/vertical/border view,也就是求樹的左視圖、右視圖、俯視圖、border view 這我沒找到中文翻譯。。這就是我所說的「峰」。

先來總圖:

最基本的三種遍歷就是

其實這三種遍歷方式本質都是一樣的,只是輸出/列印節點的順序不同罷了。

來看偽代碼吧:

public void traverse(TreeNode node) {
  if (root == null) {
    return;
  }
  //preOrder
  print(root.value);

  traverse(root.left); //真正的遍歷

  //inOrder
  print(root.value);

  traverse(root.right); //真正的遍歷

  //postOrder
  print(root.value);
}

真正的遍歷就這兩句話,無論是那種遍歷順序都是不變的,變的只是列印的順序罷了。

這三種遍歷都是深度優先遍歷 DFS,而層序遍歷是廣度優先遍歷 BFS。

DFS 和 BFS 都是圖的基本遍歷方式,我之後也會專門寫一篇。

那我們來看層序遍歷 level order traversal。

輸出 5 7 3 1 4.

參考 Leetcode 102 題。

也就是每一層按照從左到右的順序遍歷。

那麼還有一種 Zigzag 的遍歷方式,就是一行從左到右,下一行從右到左這樣子。

輸出的就是 5 3 7 1 4.

參考 Leetcode 103 題。

left/right/vertical/border view,也就是求樹的左視圖、右視圖、俯視圖,是非常愛考的一類題,它們是什麼意思呢?

比如對於這棵樹,

左視圖 left view:

右視圖 right view:

這兩個應該比較簡單,在層序遍歷的時候保留我們需要的值就可以了。

當然還有其他方法,比如前序遍歷可以做左視圖,但不是那麼的直觀,因為你還要判斷這個元素是否是當前層的第一個。大家有想法的可以在群裡交流喲。(提示:可以再加一個變量

俯視圖

這個視圖比前兩個稍微難一點,在北美面試中是很愛考的。

首先這個圖中有一個變量叫 column,根節點為 0,左孩子 - 1,右孩子 + 1。

俯視圖指的是,從上往下看這棵樹,把 column 相同的這些節點放在一個 list 裡,從上往下放,然後按照 column 從小到大的順序排出來。

所以對於這棵樹,它的俯視圖是:

[[7], [5, 9], [3], [8]]

這題就作為本文的思考題啦,不是很難,大家可以在評論區或者群裡交流~

Border View

在講完前三種視圖之後,這個 border view 想必大家都能猜出來意思了。

就是求這棵樹的「輪廓」。

比如還是這棵樹,它的 border view 就是:

5, 7, 9, 8, 3

這題的大體思路不難,但是細節很多,而且很多條件可能就像我給的這樣並沒有定義清楚,所以你需要和面試官不斷的 clarify 很多細節。

普通的思路可以用

左視圖 + 葉子結點 + 反著的右視圖

來做,表面上來看需要做三遍遍歷,但是其實一遍遍歷就夠了,因為我剛才說過,DFS 遍歷時,哪種遍歷方式都是一樣的,只是在不同時間列印不同節點罷了。

福利來咯

最讓人頭大的數據結構是什麼呢?

留言談談你的看法,

點讚前3者可分別獲贈1本《大話數據結構》!

也可直接掃碼購買,限時5折中~

相關焦點

  • 看完這篇,再也不怕面試問樹了!
    四種視圖鑑於樹相關的內容太多,而且又是面試重點內容,之後會有文章再專門來講樹有關的解題思路以及最常用的二叉搜索樹,大家敬請期待~簡介其實數據結構裡的「樹」和我們現實世界裡的樹挺像的,只不過倒過來了嘛比如這是一個股價二叉樹,其實就是我們把二叉樹放倒了看嘛。
  • 有了這份攻略,再也不怕數據分析面試了!
    今天,我就給大家分享一下,我珍藏多年的數據分析面試秘籍!1問題篇任何面試,最逃不開的是自我介紹。根據你的經歷,面試官也會針對性地問相關的問題,如某一段項目的情況,你的角色是什麼,結果如何等等。直播收入下降了怎麼分析針對xx app,你怎麼構建數據指標體系如何確定用戶是否喜歡你的內容如何拉新這裡就能看出,如果沒有豐富的項目經驗,還是比較難通過的,大家平時一定要著重積累項目經歷,多看多學
  • 求職寒冬中拿下谷歌offer · 面試經驗【文末福利】
    年底了,寫完了上一篇《求職寒冬中奮力拿下谷歌offer ·前因後果》之後,我的另一個小目標,就是把這篇面試經驗的文章,整理出來。一來,是對自己今年面試谷歌的一個經驗總結,分享給大家;二來,也是對自己疫情期間作為志願者導師,和十幾位同學做過的1對1諮詢的一個小結。
  • 這篇文章告訴你!(文末附最新前端面試資料)
    {文末有福利}早期的網站設計主要以內容為主,因此在視覺上的呈現就變得相對簡陋,而現在隨著科技的發展,人們對審美的要求越來越高,我們的網頁發生了很大的變化,企業更加注重用戶交互審美,一個產品想要長久的發展,用戶體驗就變得尤為重要。
  • 看完這篇,面試RecyclerView的時候再也不怕了
    據悉,這些員工於2018年底開始停薪留職,期間延長了一次停薪留職時間並能夠獲得相應崗位福利。根據一名前僱員提供的解僱文件,這些最新被解僱的員工福利將於6月30日到期。/   作者簡介   /本篇文章來自lyldalek的投稿,分享了他對RecyclerView的緩存機制的理解,相信會對大家有所幫助!同時也感謝作者貢獻的精彩文章。
  • 美國留學必知專業術語,有了這篇再也不怕聽不懂、看不懂啦!
    再也不怕聽不懂、看不懂啦! 材料準備 PS——Personal Statement 個人陳述,是在申請過程中按照學校要求來寫一篇有關申請人背景,學術成就和未來研究和職業目標的文章。
  • 看完這篇文章,再也不怕作文跑題了!
    如果是記敘文,要判定它是屬於哪種類型的記敘文,弄清楚題目所要求的體裁,在逐字推敲題意的基礎上,著重解決記敘文的對象、重點、範圍和人稱四個問題。看看側重寫人、記事、寫景、還是狀物。如果是寫人的,寫什麼人?記事的,寫什麼事?是一件呢,還是幾件?明確了寫作的對象和範圍,動筆時才不會偏離題目。
  • 【文末有福利】
    【文末有福利】 2020-04-23 17:38 來源:澎湃新聞·澎湃號·政務
  • 不系安全帶,首批銅陵老司機被抓拍……(文末送福利)
    不系安全帶,首批銅陵老司機被抓拍……(文末送福利) 2020-06-06 04:24 來源:澎湃新聞·澎湃號·政務
  • 10萬字的小標題彙編素材,有了這份材料再也不怕文章不出彩了
    我們來看看一個大筆桿子擬的標題,這是一份關於信訪工作的講話:把信訪群眾當「家人」把群眾來信當「家書」把信訪之事當「家事」把信訪工作當「家業」這樣的小標題要吸睛很多。大部分標題你都可以直接引用在你的文章中,有了這份素材,再也不怕文章不出彩。受限於篇幅,這裡僅分享其中部分內容,其餘需要的可以到文末免費領取。先看看分類有多全:1.「以」字篇2.
  • 有了這份全面的面試總結,再也不怕面試了
    前段時間參加了一些面試,理論實踐結合,加之我們做什麼都要研究總結一番的特質,做一個梳理。文章較長,對求職者參考價值比較大,對面試官也有些作用。PS:筆者面試的是網際網路產品經理,細節上與其他崗位略有不同(比如會有BOSS面),整體相同。
  • 巨型「櫻桃小丸子」來高島屋了,文末有福利哦
    巨型「櫻桃小丸子」來高島屋了,文末有福利哦 2020-07-17 19:16 來源:澎湃新聞·澎湃號·政務
  • 「華南第一流的而且是最著名的法學院」——法碩擇校之蘇州大學(​文末福利【秒記風火輪完整版】)
    文末福利:【秒記風火輪完整版】)(非全日制複試同全日制)3.調劑考生按調劑複試專業參加筆試和綜合面試。以上信息來自蘇州大學王健法學院及蘇大研究生學院官網同學們留言的目標院校小敏都收到了,放心,擇校篇會一直更新下去。激動的心,顫抖的手,小敏的福利走一走
  • 看這篇文章就夠了
    這篇文章將解答你的各種疑惑~—— 01 ——準備階段到底要不要到西班牙讀語言?—— 02 ——決定出國讀語言了牛學地帶能提供哪些幫助和福利?西班牙留學整體規劃我的情況適合什麼時候出國?學姐幫你規劃時間,有了時間表,再也不怕申請來不及啦語言學校篩選與定位我的情況和留學預算,適合到哪個城市讀語言?各個城市的氣候、消費水平、治安怎麼樣?選擇困難沒關係,學姐幫你選學校語言學校申請與溝通想報名語言學校?
  • 收藏這篇文章=拿下2020年所有必看推文
    (向上滑動啟閱)致讀者:2020年,我們一起看過385篇文章,我們和34197位夥伴在每個夜晚相遇。我們共同欣賞過58部好片、我們共同學習過52個藝考辭典、我們共同領略過30篇藝考經驗帖、我們共同查看過97篇藝考資訊…而且,不僅只有你我。
  • (文末福利)
    本篇適合英語零基礎和初級階段英語學習者,同時有意向孩子英語啟蒙的家長也可以參考。
  • 文末有福利哦~
    文末還有福利拿不停~   ↓↓↓   區農合聯   2020年臨安優質農特產品推介會   暨首屆青山湖寶龍民俗文化節   ~溫暖來襲~   ➤活動時間:2020年12月4月—12月8日(10:00—22:00)   ➤活動地址:臨安區青山寶龍廣場   ➤溫馨提醒:現場參與活動需亮綠碼
  • 文末有福利!
    幫你Get住拽文大師們的Point,還能讓勵志心靈雞湯瞬間變成畫風清奇的流行語……不信,你看↓↓↓The greater the man,the more restrained his anger/法國啟蒙思想家、文學家、哲學家、史學家/勵志翻譯:在這世上,不值得我們與之交談的人比比皆是。
  • 關於文件整理看這篇文章就夠了
    所以就有了這篇文章。0.再比如你下載了一個公眾號所有的文章,準備學習一下,如果不加記錄的話,你如何快速定位到你未閱讀的文章?單獨建立一個文件夾去歸檔嗎?顯然這並不是最優解。比如寫這期的推文,我要整理關於文件管理相關的方法和軟體,這都是和當前工作相關的內容,我要放到我的workflow筆記本中。對於一些可以重複使用的知識,就可以提煉出模板或者總結經驗,這也是復盤的價值和意義。
  • 【薦品】最好的推車座椅涼墊都在這了(文末有福利)
    不想看文字,就拉到最後看視頻