【坐在馬桶上看算法】算法10:二叉樹

    二叉樹是一種特殊的樹。二叉樹的特色是每一個結點最多有兩個兒子,左邊的叫作左兒子,右邊的叫作右兒子,或者說每一個結點最多有兩棵子樹。更加嚴格的遞歸定義是:二叉樹要麼爲空,要麼由根結點、左子樹和右子樹組成,而左子樹和右子樹分別是一棵二叉樹。 下面這棵樹就是一棵二叉樹。算法

105444xawrrrfk3arvcz4a.png 

    二叉樹的使用範圍最廣,一棵多叉樹也能夠轉化爲二叉樹,所以咱們將着重講解二叉樹。數組

二叉樹中還有連兩種特殊的二叉樹叫作滿二叉樹和徹底二叉樹。若是二叉樹中每一個內部結點都有兩個兒子,這樣的二叉樹叫作滿二叉樹。或者說滿二叉樹全部的葉結點都有一樣的深度。好比下面這棵二叉樹,是否是感受很「豐滿」。滿二叉樹的嚴格的定義是一棵深度爲h且有2h-1個結點的二叉樹。ide

105444lo3hqo7d75qi8pqn.png 

    若是一棵二叉樹除了最右邊位置上一個或者幾個葉結點缺乏外其它是豐滿的,那麼這樣的二叉樹就是徹底二叉樹。嚴格的定義是:若設二叉樹的高度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層從右向左連續缺若干結點,就是徹底二叉樹。也就是說若是一個結點有右子結點,那麼它必定也有左子結點。例以下面這三棵樹都是徹底二叉樹。其實你能夠將滿二叉樹理解成是一種特殊的或者極其完美的徹底二叉樹。ui

105444vaplv1en8nkl1zak.png 105444pk7odh7y5w8ck8od.png 105445rl0du14rrp533di3.png 

    其實徹底二叉樹相似下面這個形狀。spa

110107hi83hs8zpip39dk0.jpg 

    說到這裏咱們立刻就要領略到徹底二叉樹的魅力了。先想想一棵徹底二叉樹如何存儲呢?其實徹底二叉樹中父親和兒子之間有着神奇的規律,咱們只需用一個一維數組就能夠存儲徹底二叉樹。首先將徹底二叉樹進行從上到下,從左到右編號。3d

110106m7do38qdzoiuisoq.jpg 

    經過上圖咱們發現若是徹底二叉樹的一個父結點編號爲k,那麼它左兒子的編號就是2*k,右兒子的編號就是2*k+1。若是已知兒子(左兒子或右兒子)的編號是x,那麼它父結點的編號就是x/2,注意這裏只取商的整數部分。在C語言中若是除號‘/’兩邊都是整數的話,那麼商也只有整數部分(即自動向下取整),即4/25/2都是2。另外若是一棵徹底二叉樹有N個結點,那麼這個徹底二叉樹的高度爲log2 N簡寫爲log N,即最多有log N層結點。徹底二叉樹的最典型應用就是——堆。那麼堆又有什麼做用呢?請關注下週更新:堆——神奇的優先隊列。orm

    歡迎轉載,碼字不容易啊,轉載麻煩註明出處blog

    【啊哈!算法】算法10:二叉樹 http://ahalei.blog.51cto.com/4767671/1414035遞歸

相關文章
相關標籤/搜索