【資料結構】二叉樹的基礎知識
一、概述
在某個階段都是兩種結果的情形,比如開和關、0和1、真和假、上和下、對與錯、正面和反面,都適合用一種很特殊的樹狀結構 建來建模,即為二叉樹。定義如下:
1、二叉樹的特點:Degree≤2
2、二叉樹具有五種基本形態:
二、特殊二叉樹
1、斜樹
- 左/右斜樹:所有的結點都只有左/右子樹,統稱為斜樹。
- 特點:每一層都只喲一個結點,結點的個數與二叉樹的深度相同,即Depth=n.
- 線性表結構可以理解為是樹的一種及其特殊的表現形式。
2、滿二叉樹(完美二叉樹)
注意:單是每個節點都存在左右子樹不蹦不能算滿二叉樹,還必須要所有的葉子都在同一層上,這就做到了整棵樹的平衡。
- 滿二叉樹的特點:
3、完全二叉樹
注意理解:滿(完美)和完全
滿二叉樹一定是一棵完全二叉樹,但完全二叉樹不一定是滿的。
舉例說明:
完全二叉樹的特點:
判斷完全二叉樹:
三、二叉樹的性質
- 2^0、2^1、2^2......等比數列:2……i-1
- 用途:計算每次的結點數
- 2^0、2^0+2^1、2^0+2^1+2^2、......等比數列求和:(2^k)-1
- 用途:知道深度求結點數的範圍
- 終端結點就是葉子結點。
總結點數:n = n0+n1+n2
總連線數:n-1=2*n2+1*n1+0*n0 注意:n-1代表根節點沒有進入線。
聯立上邊兩個式子得到:n0=n2+1
- 用途:知道度為2的結點數求葉子結點。
深度和總結點數的關係由性質2可得:n=(2^k)-1,則k=log2(n+1)
深度為k-1的總結點數 <= 總結點數 <= 深度為k的總結點數
即(2^(k-1))-1 < n <= (2^k)-1,因為n為整數,這裡可以去掉等號即為2^(k-1) <= n < 2^k
取對數得:k-1<=log2(n)<k
k為整數,因此k的取值範圍為:
- 用途:知道結點數求深度的範圍
可自行驗證:
- 用途:知道某個編號,求雙親編號、子樹編號,判斷結點有無兄弟,判斷結點是否為葉結點等。
四、二叉樹的儲存結構
1、順序儲存結構:一般只用於完全二叉樹,因為完全二叉樹具有嚴格的定義
用^來表示不存在的結點。
對於不是完全二叉樹的樹,陣列中會有很多^,造成空間浪費,尤其是右斜樹。
2、二叉連結串列
二叉樹每個結點最多有兩個孩子,所有設計一個資料域和兩個指標域,稱為二叉連結串列。
- data:資料域
- lchild:存放左孩子的指標
- rchild:存放右孩子的指標
如有需要,可以增加一個指向雙親的parent指標域,即成為三叉連結串列。
五、遍歷二叉樹
1、訪問
2、遍歷
3、二叉樹遍歷方法
- 前序遍歷
- 中序遍歷
- 後續遍歷
- 層序遍歷
4、研究遍歷的意義:
六、線索二叉樹
對於一個有n個結點的二叉連結串列,每個結點有指向左右孩子的兩個指標域,一共2n個指標域。而n個結點的二叉樹一共n-1條分支線,也就是存在2n-(n-1)=n+1個空指標域。
為了利用這些空指標域,提出線索二叉樹。
指向前驅和後繼的指標稱為線索,加上線索的二叉鏈稱為線索連結串列,相應的二叉樹稱為線索二叉樹。
中序遍歷:HDIBEAFCG
所有的空指標域中的rchild改為指向它的後繼結點,lchild改為指向它的前驅結點。如下:
線索二叉樹,等於是把一課二叉樹轉變成了一個雙向連結串列,這樣對插入刪除結點、查詢某個結點都帶來了方便。對其遍歷,其實就等於是操作一個雙向連結串列結構。
線索化:對二叉樹以某種次序遍歷使其變為線索二叉樹的過程。
此時遇到一個問題:lchild指向的是它的左孩子還是指向前驅,rchild指向的是它的右孩子還是指向後繼?
因此增設兩個標誌域(boolean):ltag和rtag,只能存放0和1。
七、樹、森林與二叉樹的轉換
1、樹——二叉樹
2、森林——二叉樹
3、二叉樹——樹
4、二叉樹——森林
5、樹與森林的遍歷
八、哈弗曼樹
最基本的壓縮編碼方法——哈弗曼編碼
1、哈弗曼樹
- 路徑長度:從樹中一個結點到另一個結點之間的分支構成兩個結點之間的路徑,路徑上的分支數目稱作路徑長度。
- 樹的路徑長度:從樹根到每一結點的路徑長度之和。
a樹的路徑長度為20,b樹的路徑長度為16。
考慮帶權的結點:
- 結點的帶權的路徑長度:該結點到樹根之間的路徑長度與結點上權的乘積。
- 樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和。
2、構造哈弗曼樹的步驟:
3、哈夫曼編碼
相關文章
- 公共基礎知識-資料結構-樹資料結構
- 【資料結構】樹的基本知識資料結構
- 深入理解資料結構--二叉樹(基礎篇)資料結構二叉樹
- 【資料結構】棧的基礎知識(無程式碼)資料結構
- 【資料結構】串的基礎知識(無程式碼)資料結構
- 資料結構與演算法-kd二叉樹(基礎)資料結構演算法二叉樹
- Rust中陣列資料結構基礎知識Rust陣列資料結構
- 【資料結構&演算法】11-樹基礎&二叉樹遍歷資料結構演算法二叉樹
- 資料結構(樹):二叉樹資料結構二叉樹
- 【資料結構】佇列的基礎知識(無程式碼)資料結構佇列
- 資料結構基礎--字首樹&&字尾樹資料結構
- Android技能樹 — 樹基礎知識小結(一)Android
- 資料結構與演算法之基礎知識資料結構演算法
- 資料結構與演算法 二叉樹基本框架與知識點資料結構演算法二叉樹框架
- 資料結構 - 二叉樹資料結構二叉樹
- 資料結構-二叉樹資料結構二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 資料結構-平衡二叉樹資料結構二叉樹
- 資料結構之「二叉樹」資料結構二叉樹
- 資料結構和演算法面試題系列—二叉樹基礎資料結構演算法面試題二叉樹
- 達夢資料庫基礎知識(二)資料庫邏輯結構資料庫
- [資料結構] 樹、二叉樹、森林的轉換資料結構二叉樹
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- Redis基礎知識(學習筆記1--五種基礎資料結構)Redis筆記資料結構
- 資料結構基礎03-紅黑樹資料結構
- 達夢資料庫基礎知識(一)資料庫物理儲存結構資料庫
- 資料結構二叉樹學習資料結構二叉樹
- 資料結構-二叉樹、堆、圖資料結構二叉樹
- 資料結構 二叉樹遍歷資料結構二叉樹
- 資料結構——二叉樹進階資料結構二叉樹
- 資料結構-二叉搜尋樹資料結構
- 【資料結構】二叉搜尋樹!!!資料結構
- 資料結構的故事之二叉樹, 字首樹, N叉樹資料結構二叉樹
- 資料庫基礎知識資料庫
- 重學資料結構(六、樹和二叉樹)資料結構二叉樹
- 重學資料結構之樹和二叉樹資料結構二叉樹
- 二叉樹的知識點二叉樹
- 資料結構☞二叉搜尋樹BST資料結構