數據結構(十)——二叉樹

二叉樹的定義:

二叉樹是n個結點的有限集合,該集合或者爲空集,或者由一個根結點和兩棵互不相交的、分別稱爲根結點的左子樹和右子樹的二叉樹組成。如下圖:


二叉樹的特點:
1.每個結點最多有兩棵子樹,所以二叉樹中不存在度大於2的結點。
2.左子樹和右子樹是有順序的,次序不能任意顛倒。
3.即使樹中某結點只有一棵樹,也要區分它是左子樹還是右子樹。


二叉樹的五種基本形態:
1.空二叉樹
2.只有一個根結點
3.根結點只有左子樹
4.根結點只有右子樹
5.根結點既有左子樹又有右子樹


特殊二叉樹:
1.斜樹
所有的結點都只有左子樹的二叉樹叫做左斜樹;所有的結點都只有右子樹的二叉樹叫做右斜樹。這兩者統稱斜樹。


2.滿二叉樹
在一棵二叉樹中,如果所有分支結點都存在左子樹和右子樹,並且所有葉子都在同一層上,這樣的二叉樹稱爲滿二叉樹。
滿二叉樹的特點:

(1)葉子只能出現在最下一層。
(2)非葉子結點的度一定是2
(3)在同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子樹最多。

滿二叉樹如圖:


3.完全二叉樹
對一棵具有n個結點的二叉樹按層序編號,如果編號爲i的結點與同樣深度的滿二叉樹中編號爲i的結點在二叉樹中位置完全相同,則這棵二叉樹稱爲完全二叉樹。如下圖:


完全二叉樹的特點
(1)葉子結點只能出現在最下兩層
(2)最下層的葉子一定集中在左部連續位置
(3)倒數二層,若有葉子結點,一定都在右部連續位置
(4)如果結點度爲1,則該結點只有左孩子,即不存在只有右子樹的情況
(5)同樣結點的二叉樹,完全二叉樹的深度最小


二叉樹的性質:
性質1:在二叉樹的第i層上至多有2^(i - 1)個結點。
性質2:深度爲k的二叉樹至多有2^k-1個結點。
性質3:對於任何一棵二叉樹T,如果其終端結點數爲n0,度爲2的結點樹爲n2,則n0 = n2 + 1。
性質4:具有n個結點的完全二叉樹的深度爲 不大於log2n的最大整數 +1。
性質5:如果對一棵具有n個結點的完全二叉樹的結點按層序編號,對任一結點i有:
       (1)如果i=1,則結點i是二叉樹的根,無雙親,如果i>1則其雙親是結點 是不大於i/2的最大整數
       (2)如果2i>n,則結點i無左孩子;否則其左孩子是結點2i
       (3)如果2i+1>n,則結點i無右孩子;否則其右孩子是結點2i+1


二叉樹的存儲結構:

因爲順序存儲結構的適用性不強,所以我們着重於鏈式結構,即二叉鏈表。二叉樹每個結點最多有兩個孩子,所以爲它設計一個數據域和兩個指針域,我們稱這樣的鏈表爲二叉鏈表。結構如下圖:


其中data是數據域,lchild和rchild是指針域,分別指向左孩子和右孩子的指針。

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. /*二叉樹的二叉鏈表結點結構定義*/  
  2. typedef struct BiTNode  
  3. {  
  4.     int data;  
  5.     struct BiTNode *lchild,*rchild;  
  6. }BiTNode,*BiTree;  

示意圖如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章