讀《Java數據結構和算法》(第八章)

讀《Java數據結構和算法》(第八章)

一、第八章8.1

1、樹
(1)二叉樹是編寫程序中使用的一種基本的數據存儲結構
(2)樹的優點
結合有序數組和鏈表,在樹中查找數據項的速度和在有序數組中查找一樣快,並且插入數據項和刪除數據項的速度也和鏈表一樣
(3)既能像鏈表那樣快速的插入和刪除,又能像有序數組那樣快速查找
(4)樹由邊連接的節點而構成
(5)Java語言編寫的程序常常用引用來表示邊

2、樹的術語
(1)路徑
順着連接節點的邊從一個節點走向另一個節點,所經過的節點的順序排列就稱爲“路徑”
(2)根
樹頂端的節點稱爲“根”,一棵樹只有一個根,如果把一個節點和邊的集合定義爲樹,那麼從根到其他任何一個節點都必須有一條(而且只有一條)路徑
(3)父節點
每個節點(除了根)都恰好有一條邊向上連接到另一個節點,上面這個節點就稱爲“父節點”
(4)字節點
每個節點都可能有一條或多條邊向下連接其他節點
(5)葉節點
沒有子節點的節點稱爲“葉子節點”或者簡稱“葉節點”,樹中只有一個根,但是可以有很多葉節點
(6)子樹
每個節點都可以作爲“子樹”的根
(7)訪問
當程序控制流程到達某個節點時,稱爲“訪問”這個節點,通常是爲了在這個節點處執行某種操作。
如果僅僅是在路徑上從某個節點到另一個節點時經過了一個節點,不認爲是訪問了這個節點
(8)遍歷
遍歷樹意味着要遵循某種特定的順序訪問樹中所有節點
(9)層
一個節點的層數是指從根開始到這個節點有多少“代”
(10)關鍵字
對象中通常會有一個數據域被指定爲關鍵字值,這個值常用於查詢或其他的操作

2、二叉樹
(1)二叉樹的每個節點最多有兩個子節點
(2)二叉樹中的節點不是必須有兩個字節點,可以只有一個左節點,或者只有一個右節點,或者乾脆沒有子節點(這種情況下就是葉節點)
(3)二叉搜索樹特徵的定義:一個節點的左子節點的關鍵字值小於這個節點,右子節點的關鍵字值大於或者等於這個父節點

3、非平衡樹
(1)非平衡樹大部分的節點在根的一邊或者另一邊
(2)樹變得不平衡是由數據項插入的順序造成的

4、樹的效率
(1)查找節點的時間取決於這個節點所在的層數
(2)時間複雜度爲O(logN),以2爲底的對數

5、插入節點
(1)要插入節點,必須先找到插入的地方
(2)從根開始查找一個相應的節點,將是新節點的父節點
(3)當父節點找到了,新的節點就可以連接到它的左子節點或右子節點處

6、遍歷樹
(1)遍歷樹是根據一種特定順序訪問樹的每一個節點
(2)三種方法:前序(preorder),中序(inorder) 後序(postorder)

7、中序遍歷
(1)中序遍歷二叉搜索樹會使所有的節點按關鍵字升序被訪問到
(2)遞歸遍歷樹,需要用一個節點作爲參數,初始化時這個節點爲根

調用自身來遍歷節點的左子樹
訪問這個節點
調用自身來遍歷節點的右子樹

二、第八章8.2

1、二叉樹的效率
(1)一棵滿樹中大約一半的節點在最底層
(2)如果是滿樹,最底層的節點個數比樹的其他節點數多1
(3)常見的樹的操作時間複雜度大致是N以2爲底的對數
(4)對於給定層數的樹,不滿的樹的平均查找時間比滿樹要短,因爲它在較低的層上完成查找的次數要比滿樹時少

2、哈夫曼Huffman編碼
(1)使用二叉樹以令人驚訝的方式壓縮數據
(2)計算機裏每個字符在沒有壓縮的文本文件中由一個字節(如ASCII碼)或兩個字節(如Unicode)
(3)壓縮數據方式:對文本最常用的方法是減少最常用字符的位數量
(4)消息中出現的字符在樹中是葉節點,在消息中出現的頻率越高,在樹中的位置就越高

三、小結

1、樹執行查找、插入、刪除的時間複雜度都是O(logN)
2、插入需要找到要插入新節點的位置並改變它父節點的子字段來指向它
3、中序遍歷按照關鍵值得升序訪問節點
4、前序和後序遍歷對解析代數表達式是有用的
5、刪除
(1)如果一個節點沒有子節點,刪除它只要把它得父節點得子字段設置爲null即可
(2)如果一個節點有一個子節點,把它父節點得子字段設置爲它得子節點,就可刪除它
(3)如果一個節點有兩個子節點,刪除它要用它得後繼來代替它
(4)數組中重複關鍵字值得的節點會產生一些問題,因爲只有第一個能被查找到
5、哈夫曼樹是二叉樹(但不是二叉搜索樹),用於數據壓縮算法,這種方法稱爲哈夫曼編碼
6、哈夫曼編碼中,最經常出現的字符的編碼位數最少,很少出現的字符編碼位數要多一些

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