《大話資料結構7》—— “二叉樹的定義和性質以及特殊二叉樹”
二叉樹的定義
● 二叉樹(Binary Tree)是n(n>=0)個結點的有限集合,該集合或者為空集(空二叉樹),或者由一個根結點和兩棵互不相交的、分別稱為根結點的左子樹和右子樹的二叉樹組成。 如圖就是一棵二叉樹
二叉樹的特點
(1)每個結點最多有兩棵子樹,所以二叉樹中不存在度大於2的結點。 注意:不是隻有兩課子樹,只有一棵或者沒有都是可以的。
(2)左子樹和右子樹是有順序的,次序不能顛倒。
(3)即使樹中只有一顆子樹,也要區分是左子樹還是右子樹。下圖中兩顆樹是不同的兩顆二叉樹。
二叉樹具有五種基本形態:
(1)空二叉樹;(2)只有一個根結點;(3)根結點只有左子樹;(4)根結點只有右子樹;(5)根結點既有左子樹又有右子樹。
特殊的二叉樹
斜樹:所有的結點都只有左子樹的二叉樹稱為左斜樹。所有的結點都只有右子樹的二叉樹稱為右斜樹。如上圖3就是左斜樹、圖4就是右斜樹。
滿二叉樹:在一棵二叉樹中,如果所有分支結點都存在左子樹和右子樹,並且所有葉子都在同一層上,這樣的二叉樹就稱為滿二叉樹,如圖:一棵深度為k且由(2^k)-1 (k>=1) 個結點的二叉樹稱為滿二叉樹。
滿二叉樹的特點有:
(1)葉子只能出現在最下一層。出現在其他層就不可能達到平衡。
(2)非葉子結點的度一定是2。
(3)在同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子樹最多。
完全二叉樹:
對一棵具有n個結點的二叉樹按層序編號,如果編號為i(1<=i<=n)的結點與同樣深度的滿二叉樹中編號為i的結點在二叉樹中位置完全相同,則這棵二叉樹稱為完全二叉樹,如圖:
完全二叉樹的特點:
(1)葉子結點只能出現在最下兩層。
(2)最下層的葉子一定集中在左部連續位置
(3)倒數二層,若有葉子結點,一定都在右部連續位置。
(4)如果結點度為1,則該結點只有左孩子,即不存在只有右子樹的情況。
(5)同樣結點數的二叉樹,完全二叉樹的深度最小(同樣適用於滿二叉樹)。
注意:滿二叉樹一定是棵完全二叉樹,但完全二叉樹不一定是滿的。
滿二叉樹和完全二叉樹的區別:
滿二叉樹就是每一層的葉子節點都是滿的,而完全二叉樹則是一棵這樣的樹:如果把它的所有n個節點從上到下,從左到右依次編號,那麼與對應的完全二叉樹是相同的。也就是說,完全二叉樹像是把滿二叉樹的最後若干的元素去掉。
這類二叉樹有一個特點:就是按照節點序號可以確定節點之間的父子關係:編號為i的節點的兩個子節點序號是2*i和2*i+1;而編號為i的節點的父節點序號是i/2(整除)。所以可以通過陣列來儲存這類二叉樹,這樣它的操作會很方便。對於其他的二叉樹,可以通過給那些缺失的節點補一個特殊的值來轉化成完全二叉樹。當然,如果補的節點太多,就得不償失了。
二叉樹的性質
二叉樹的性質一 : 在二叉樹的第i層上至多有2^(i-1)個結點(i>=1) —— 計算某個二叉樹中某一層最多有多少個結點。
二叉樹的性質二:深度為k的二叉樹至多有(2^k)-1個結點(k>=1) —— 求一個二叉樹最多有多少個結點。
二叉樹的性質三:對任何一棵二叉樹,如果其終端結點(葉子結點)樹為n0,度為2的結點數為n2,則n0=n2 + 1 —— 就是找一棵二叉樹有多少個終端結點。
終端結點個數 = 結點度為2的結點總個數+1, 如下圖, 有A 、B、C、D, 它們的度都為2, 那麼 有4個結點, 4+1=5, 那麼終端結點的個數就是5;
分支線總數=結點的總個數 - 1. 如下圖的 結點的總個數為10, 10-1 = 9,分支線為9.
分支線總數 = 結點度為1 的總個數 + 2*(結點度為2的總個數);如下圖, 結點度為1的,只有E, 結點度為2的,有A 、B、C、D, 那就是 1+2*4= 9;
結點的個數 = 分支線 總個數 +1; 如圖: 分支線 9 +1 =10個結點。
結點的個數 = 結點度為0的總個數 + 結點度為1的總個數 + 結點度為1的總個數。 如圖: 結點度為0的有5, 結點度為1的有1個,結點度為2的,有4個, 5+1+4=10個結點。
結點的個數 = 結點度為1的總個數 + 2*(結點的度為2的總個數)+1, 如圖: 結點度為1的。有一個E, 結點度為2的,有4個。 那麼就是 1+2*4+1=10個結點。
二叉樹的性質四:具有n個結點的完全二叉樹的深度為:⌊log₂n⌋+1 (⌊log₂n⌋取log₂n的下限), 這個公式同樣適合求滿二叉樹的深度 —— 簡單地說就是求一顆 滿二叉樹 和 完全二叉樹的 深度,
證明:由滿二叉樹的定義結合性質二我們知道,深度為k的滿二叉樹的結點樹n一定是2^k-1 個結點。
那麼對於滿二叉樹我們可以通過n=2^k-1倒推得到滿二叉樹的深度為:
k=log₂(n+1)
由於完全二叉樹前邊我們已經提到,它的葉子結點只會出現在最下面的兩層,我們可以同樣如下推導
那麼對於倒數第二層的滿二叉樹我們同樣很容易回推出它的結點數為n=2^(k-1)-1
所以完全二叉樹的結點數的取值範圍是:2^(k-1)-1 < n <= 2^k-1
由於n是整數,n <= 2^k-1可以看成n < 2^k
同理2^(k-1)-1 < n可以看成2^(k-1) <= n
所以2^(k-1) <= n < 2^k
不等式兩邊同時取對數,得到k-1<=log₂n<k
由於k是深度,必須取整,所以k=⌊log₂n⌋+1
二叉樹的性質五:如果對一棵有n個結點的完全二叉樹(其深度為⌊log₂n⌋+1)的結點按層序(從左到右)編號,對任一結點i(1<=i<=n)有以下性質:
如果i = 1,則結點 i 是二叉樹的根,無雙親; 如果i > 1,則其雙親是結點⌊i / 2⌋ —— 就是求一個結點的雙親 = 第 i 個結點 / 2.
求某個節點的雙親 = 如果是左子樹 / 2; 如圖: 結點8*2=4, 4 結點就是8 的雙親。
求某個節點的雙親 = (如果是右子樹 - 1) / 2; 如圖: 結點 ( 9 -1 )/ 2 =4。 4 結點就是9 的雙親。
如果2i > n,則結點 i 無左孩子(結點 i 為葉子結點);否則其左孩子是結點2i. —— 就是求某個結點的 左孩子。
某個結點的左孩子 = 2*i。如果結點2, 2*2 =4 , 結點 4就是它的左孩子。如果 2*i 大於結點個數,那麼該結點既沒有左孩子,也沒有右孩子, 該結點是個葉子節點。 如圖: 結點6 *2 =12; 超過結點個數10 ,所以結點6是個葉子結點。
同樣,而結點5, 因為 2 *5 =10 ;正好是結點總數10 , 所以它的左孩子是 10;
如果2i+1 > n,則結點 i 無右孩子;否則其右孩子是結點2i+1 。 —— 就是求一個結點的右孩子;
某個結點的右孩子 = 2 *i + 1;如圖: 結點4 * 2 +1=9, 結點9就是它的右孩子。如果 某個結點 2 *i + 1 大於 結點的個數, 那麼該結點就沒有右孩子; 比如結點5* 2 +1 =11; 所以該結點沒有 右孩子。