數據結構學習第四彈 二叉樹的性質和存儲結構

二叉樹的性質

滿二叉樹

性質1:

在二叉樹的第i層上至多有2^(i-1)個結點(i>0)

因為一個節點度不大于2(即每個結點只能有兩棵子樹),如果假設這棵二叉樹是一棵滿二叉樹,那么每個結點都有兩棵子樹,按每層來看的話,會發現它是首項為1,公比為2的等比數列,所以第i層最多有2^(i-1)個結點(i>0)

性質2:

一棵深度為k的二叉樹中,最多有2^k-1個結點

其實這也很好得出這個性質,既然每層的結點數量就是等比數列的一項,那么深度為k的樹,假設為滿二叉樹,那么結點總數就是等比數列求和,所以,一棵深度為k的二叉樹中,最多有2^k-1個結點

性質3:

具有n個結點的完全二叉樹的深度k為[log2n]+1

其實就是性質2的逆推,假設有棵深度為x的完全二叉樹,那么他的結點總數的范圍為2^(k-1)-1 < n <= 2^k-1,兩邊同時取對數得k-1 < og2n <= k,具有n個結點的完全二叉樹的深度k為[log2n]+1

性質4:

對于一棵非空的二叉樹,如果葉子結點數為n0,度為2的結點數為n2,
n0 = n2+1

整棵樹的結點數: n = n0+n1+n2 (n0葉子結點數,n1度為1的結點數,n2度為2的結點數)
根據節點度的定義子結點的的數量為: n0×0+n1×1+n2×2
子節點的數量為:n-1 (除根以外每個結點都是子節點)
所以解得 n0 = n2+1

性質5:

對于具有n個節點的完全二叉樹,如果按照從上至下和從左至右的順序對二叉樹中所有結點進行從1的編號,則對于任意的序號為i結點,有:

  • 如果i>1,則序號為i的結點的雙親結點為i/2,如果i==1,則序號為i的結點是根節點,無雙親結點
  • 如果2i<=n,則序號為i的結點的左孩子節點的序號為2i,否則i結點無左孩子
  • 如果2i+1<=n,則序號為i的結點的右孩子節點的序號為2i,否則i結點無右孩子

注意:性質1,2,4所有二叉樹都通用,性質3,5只有完全二叉樹適用

二叉樹的存儲結構

二叉樹的存儲方式也可以分為順序存儲結構和鏈式存儲結構兩種存儲結構

二叉樹的順序存儲結構

這里的順序存儲也是用一組連續的存儲單元依次從上至下,從左至右存儲二叉樹上的節點元素。對于完全二叉樹來說樹中結點的序號都是按照從上至下,從左至右進行編排的,所以結點的序號可以唯一的反映節點之間的邏輯關系(性質5)


完全二叉樹

存儲在數組中,數組下表從零開始

數組下標 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
-------|----------------------------------
數據 | A | B | C | D | E | F | G | H | I

如果是一般的二叉樹的話,如果我在對他進行從上至下,從左至右進行編號時就不能很好的反映數組元素之間的關系了,如果我們進行適當的改造,通過添加一些結點,把他補成一顆完全二叉樹,那么再進行編號,就可以進行順序存儲了

經過改造的一般二叉樹

數組下標 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
-------|--------------------------------------------
數據 | A | B | C | D | E | 0 | 0 | 0 | 0 | 0 | F

由此可以看出,這樣的存儲方式,會造成很多空間的浪費,而且如果要進行對樹上元素進行刪除、插入操作需要移動大量的數據元素,因此二叉樹不宜采用順序存儲結構

二叉樹的鏈式存儲結構

二叉樹的鏈式存儲結構就是,用類似于鏈表的存儲方法來存儲樹上元素的邏輯關系,即用指針來表示元素之間的邏輯關系


結點的存儲結構

data是數據域,leftChild和rightChild是指針域,leftChild是
指向左兒子的指針,rightChild是指向有兒子的指針,當左兒子或右兒子為空時,相應的指針域也為空

代碼描述

//存儲的數據類型
typedef char DataType
typedef struct node
{
    DataType data;              //數據域
    struct node* leftChild;     //左兒子
    struct node* rightChild;    //右兒子
}BinNode;
typedef BinNode* BinTree;

這是二叉鏈表的定義,除此之外還有三叉鏈表,三叉鏈表比起二叉鏈表多了一個指向雙親結點的指針域,如圖所示

結點的存儲結構

代碼描述

//存儲的數據類型
typedef char DataType
typedef struct node
{
    DataType data;              //數據域
    struct node* leftChild;     //左兒子
    struct node* rightChild;    //右兒子
    struct node* parent;        //雙親
}BinNode;
typedef BinNode* BinTree;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容