植樹節,種個二叉樹吧

 

3 月 12 號,是全國的重大節日:植樹節。記得小時候就跟隨老師一塊兒植過樹。如今參加工做了,雖然沒有植過樹,可是學到過不少樹的結構,好比二叉樹、B+ 樹,紅黑樹。每次面試必問,恰逢植樹節,原本是想講解 B 樹,但發現必需要理解了二叉樹以後才能更好地講解 B 樹,因此先給你們講下二叉樹是什麼,後面文章再更新 B 樹。面試

大白話講解二叉樹

好比如今有個數組,存放了不少用戶的名字,須要從這個數組中找到包含指定的用戶名,最快的方式是什麼?算法

咱們會想到二分查找,雖然這種方式很快,但要達到最快還須要有個條件:數組有序。數組

若是咱們能把插入用戶名的時候直接給他排序,那最後的結構就是有序結構。數據結構

所以有人設計了一種數據結構:二叉查找樹,也叫作二叉樹。ide

以下圖所示:這是一種二叉樹結構。設計

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=二叉樹

根據上文中的例子的,假定 Herry 在最上面,下面有 Alice,Mike,Ivy,Tom,從左到右,從上到下來看的話,最後的排序是:Alice->Herry->Ivy->Mike->Tom,確實是按照字母順序排的。3d

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=名字排序說明

其中有四個術語須要說明:節點、左節點、右節點、根節點。blog

其中每一個紅色圓球都算一個節點,節點左下邊相鏈接的節點叫作左節點,而右邊相連的叫作右節點。好比 Alice 被稱做 Herry 節點的左節點,Mike 被稱做 Herry 的右節點。而根節點只會有一個,屬於最上面的節點,上圖中的 Herry 就是根節點。排序

對於其中每一個節點,左子節點的值都比它小,而右子節點的值都比它大。好比 Alice < Herry < Mike。索引

假設如今咱們想要查找 Ivy,首先檢查根節點,發現比 Herry 大,因此往下繼續找,找到了根節點的右節點 Mike,再繼續找,比 Mike 小,因此找 Mike 的左節點,正好找到 Ivy。

二叉查找樹中查找節點時,平均運行時間是 O(logn),最糟糕的狀況下所需時間爲 O(n); 而在有序數組中查找時,及時最糟糕的狀況,二分查找最多也是 O(logn),因此你可能會以爲,二分查找比二叉查找要快不少。可是二叉查找樹的插入和刪除操做的速度是要快不少的。這裏咱們作一個對比:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=二叉樹與二分查找算法對比

可是二叉樹也有缺點:

  • 不能隨機訪問。好比想要查找第 10 個元素,是不能返回第十個元素的,可是數組就能夠經過下標索引找到。
  • 二叉樹存在不平衡的狀況,好比以根節點爲中間的界限,發現右邊的節點數遠超左邊的節點數,那麼左右不平衡,查找的效率就很低了。以下圖所示:
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=右邊節點數遠大於左邊節點數

那有沒有平衡的二叉樹呢?固然有,那就是紅黑樹,限於篇幅和側重點,這個放到下篇再講吧

二叉樹中的含義

二叉樹定義

大白話說二叉樹就是每一個節點只能有兩顆子樹,且有左右之分。

來看看專業定義:二叉樹是 n(n>=0 ) 個結點的有限集合,該集合或者爲空集(稱爲空二叉樹),或者由一個根結點和兩棵互不相交的、分別稱爲根結點的左子樹和右子樹組成。

二叉樹有 5 種形態

  • 空二叉樹。
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  • 只有一個根節點的二叉樹。
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  • 只有左子樹
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  • 只有右子樹。
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  • 徹底二叉樹。
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

節點的度

定義:節點擁有的子樹數目稱爲節點的度。

咱們來看下圖就一目瞭然了。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=mark

好比節點 B 的度爲 2,節點 E 的度 爲 1.

而樹的度就是全部節點的度的最大值,也就是 2。

節點層次

以下圖所示:根節點爲第一層,依次類推。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

二叉樹的特色

  • 每一個節點最多有顆子樹,因此二叉樹中不存在度大於 2 的節點。
  • 左右子樹是有順序的,次序不能任意顛倒。
  • 即便某個節點只有一顆子樹,也是須要區分它是左子樹仍是右子樹。

二叉樹的遍歷

二叉樹的遍歷:從二叉樹的根節點出發,按照某種次序依次訪問二叉樹中的全部節點,使得每一個節點都能被訪問一次,且僅被訪問一次。

二叉樹的訪問次序能夠分爲四種:

  • 前序遍歷。
  • 中序遍歷。
  • 後續遍歷。
  • 層序遍歷。

前序遍歷:通俗的說就是從二叉樹的根結點出發,當第一次到達結點時就輸出結點數據,按照先向左再向右的方向訪問。

中序遍歷:就是從二叉樹的根結點出發,當第二次到達結點時就輸出結點數據,按照先向左再向右的方向訪問。

後序遍歷:就是從二叉樹的根結點出發,當第三次到達結點時就輸出結點數據,按照先向左再向右的方向訪問。

層次遍歷:就是按照樹的層次自上而下的遍歷二叉樹。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=mark

按照前序遍歷的結果就是 BADCE。

按照中序遍歷的結果就是 ABCDE。

按照後續遍歷的結果就是 ACEDB。

按照層次遍歷的結果就是 BADCE。

本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索