本篇章主要梳理下二叉樹的內容,重點在於堆的創建、插入、刪除、排序等內容,進行詳細圖解。
1. 二叉樹
1.1 概念
一棵二叉樹是結點的一個有限集合,該集合或者爲空,或者是由一個根節點加上兩棵別稱爲左子樹和右子樹的二叉樹組成。
【二叉樹的特點】
- 每個節點最多有兩棵子樹,即二叉樹不存在度大於2的節點;
- 二叉樹的子樹有左右之分,其子樹的次序不能顛倒。
1.2 特殊二叉樹
【滿二叉樹】
- 一棵二叉樹,如果每一個層的節點數都達到最大值,則這個二叉樹就是滿二叉樹,也就是說,如果一個二叉樹的層數爲K,且節點總數是(2^k) -1,則它就是滿二叉樹。
【完全二叉樹】
- 完全二叉樹是由滿二叉樹引申而來。對於深度爲K,有n個節點的二叉樹,當且僅當其每一個節點都與深度爲K的滿二叉樹中編號從1至n的結點一一對應時稱之爲完全二叉樹;
- 滿二叉樹是一種特殊的完全二叉樹。
1.3 二叉樹的存儲
- 二叉樹有兩種結構存儲:順序結構,鏈式結構 。
- 順序結構存儲:使用數組來存儲,一般使用數組只適合完全二叉樹,因爲不是完全二叉樹會有空間的浪費。而順序結構存儲通常是把堆進行數組存儲,二叉樹順序存儲在是一個數組,在邏輯上是一顆二叉樹。
- 鏈式存儲結構:用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關係。通常的方法是鏈表中每個節點由三個域組成,數據域和左右指針域,左右指針分別用來給出該節點左孩子和右孩子所在的鏈節點的存儲地址。
2. 順序結構
- 通常把堆(一種二叉樹)使用順序結構的數組來存儲。
2.1 堆的概念
- 如果有一個關鍵碼的集合K = {k0,k1,k2,…,kn-1},把它的所有元素按完全二叉樹的順序存儲方式存儲在一個一維數組中,並滿足:Ki <= K2i+1 且 Ki <= K2i+2 ,i = 0,1,2…,則稱爲小堆;Ki >= K2i+1 且 Ki >= K2i+2 ,i = 0,1,2…,則稱爲大堆。
- 根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。
【堆的性質】
- 堆中某個節點的值總是不大於或不小於其父節點的值 ;
- 堆總是一棵完全二叉樹。
【堆的存儲】
2.2 堆的實現
2.2.1 堆的創建
-
一般給出一個數組,這個數組邏輯上可以看做一顆完全二叉樹,但是並一個堆,通過算法把它構建成一個堆。從倒數的第一個非葉子節點的子樹開始調整,一直調整到根節點的樹,就可以調整成堆。
2.2.2 堆的插入 -
將數據插入到數組的尾上,再進行向上調整算法,直到滿足堆結構。
2.2.3 堆的刪除 -
刪除堆是刪除堆頂的數據,將堆頂的數據與最後一個數據交換,然後刪除數組最後一個數據,再進行向下調整算法。
2.2.4 堆的排序
3.鏈式結構
【遍歷】
- NLR:前序遍歷(Preorder Traversal 也稱先序遍歷)——根、左、右
- LNR:中序遍歷(Inorder Traversal)——左、根、右
- LRN:後序遍歷(Postorder Traversal)——左、右、根
- 層序遍歷:從二叉樹的根節點(第1層)出發,首先訪問第一層的樹根節點,然後從左到右訪問第2層上的節點,接着是第3層的節點,以此類推,自上而下,自左至右逐層訪問樹的結點
若哪裏有不足,請指正,會及時改正。