Java數據結構和算法:第8章

二叉樹

8.1 為什么使用二叉樹

  • 因為它結合了數組和鏈表的優(yōu)點,查找的速度和數組一樣快院仿,增刪的速度和鏈表一樣快。

8.1.1 在有序數組中插入數據項太慢

  • 查找數據項使用二分法勺届,需要O(logN)時間
  • 插入或者刪除需要移動一半的數據項(N/2次移動)

8.1.2 在鏈表中查找太慢

  • 鏈表中插入和刪除極快,時間復雜度為O(1)
  • 鏈表中查找要從頭開始遍歷娶耍,并且逐個比較免姿,費時為O(N)
  • 鏈表不支持隨機訪問

8.1.3 用樹解決問題

要是能有一種數據結構,既能像鏈表那樣快速的插入和刪除榕酒,又能像有序數組那樣快速查找胚膊,那樣就好了故俐。實現了這些特點,成為最有意思的數據結構之一紊婉。

8.1.4 樹是什么

  • 本章著重講解的是一種特殊的的樹——二叉樹
  • 先從廣義上討論一下:樹由連接的節(jié)點而構成
    1. 節(jié)點:代表實體药版,或者說是對象
    2. 邊:代表路徑,或者說是引用
  • 二叉樹:每個節(jié)點最多有兩個子節(jié)點

8.2 樹的術語

8.2.1 路徑

  • 從一個節(jié)點走到另一個節(jié)點喻犁,所經過的節(jié)點的順序排列就稱為“路徑”槽片。

8.2.2 根

  • 樹頂端的節(jié)點稱為“根”
  • 從根到任意節(jié)點有且僅有一條路徑

8.2.3 父節(jié)點

  • 每個節(jié)點向上只有一條路徑

8.2.4 子節(jié)點

  • 每個節(jié)點向下可能有多條路徑

8.2.5 葉節(jié)點

  • 沒有子節(jié)點的稱為葉節(jié)點

8.2.6 子樹

  • 一個節(jié)點所有的后代

8.2.7 訪問

  • 查看節(jié)點的數據

8.2.8 遍歷

  • 遵循某種特定的順序訪問樹中所有節(jié)點,例如升序

8.2.9 層

  • 根節(jié)點是第0層

8.2.10 關鍵字

  • 對象中通常會有一個數據域被指定為關鍵字值
  • 將關鍵字顯示在樹節(jié)點的圓圈中

8.2.11 二叉樹

  • 最多只有兩個子節(jié)點的樹稱為二叉樹
  • 二叉搜索樹:左子節(jié)點的值小于父節(jié)點株汉,右子節(jié)點的值大于或等于父節(jié)點

8.3 一個類比

  • 計算機系統(tǒng)中筐乳,人們常遇到的樹是分級文件結構
  • 目錄對應著子節(jié)點,文件對應著葉節(jié)點

8.4 二叉搜索樹如何工作

  • 對于一個給定關鍵字的節(jié)點乔妈,在一顆普通的二叉樹中如何插入,刪除氓皱,遍歷路召。

8.4.1 BinaryTree專題applet

  • 非平衡樹
    1. 大部分節(jié)點在根的一邊
    2. 它的個別子樹依然可能是非平衡樹
    3. 非平衡樹源自于有序的插入

8.4.2 用Java代碼表示樹

  • 可以用數組或者鏈表實現

8.5 查找節(jié)點

  • 根據關鍵值查找節(jié)點是樹的主要操作中最簡單的,所以本章從查找開始學習波材。

8.5.1 使用專題applet查找一個節(jié)點

8.5.2 查找節(jié)點的Java代碼

8.5.3 樹的效率

8.6 插入一個節(jié)點

  • 要插入節(jié)點股淡,必須先找到插入的地方,這很像要找一個不存在的節(jié)點的過程廷区。

8.6.1 使用專題applet插入一個節(jié)點

8.6.2 插入一個節(jié)點的Java代碼

  • 記錄目標的父節(jié)點:parent

8.7 遍歷樹

  • 遍歷樹的意思是根據一種特定順序訪問樹的每一個節(jié)點唯灵。

8.7.1 中序遍歷

  • 中序遍歷二叉搜索樹會使所有的節(jié)點按關鍵字值升序被訪問到

8.7.2 遍歷的Java代碼

8.7.3 遍歷一顆三節(jié)點樹

8.7.4 用專題applet遍歷

8.7.5 前序和后序遍歷

  • 前綴表達式
  • 后綴表達式

8.8 查找最大值和最小值

順便說一下,在二叉搜索樹中得到最大值最小值是輕而易舉的事情隙轻。

  • 最小值:從根開始埠帕,往左走,找到一個沒有左子節(jié)點的節(jié)點玖绿。
  • 最大值:從根開始敛瓷,往右走,找到一個沒有右子節(jié)點的節(jié)點斑匪。

8.9 刪除節(jié)點

  • 刪除節(jié)點是二叉搜索樹常用的一般操作中最復雜的呐籽。

8.9.1 情況1:刪除沒有子節(jié)點的節(jié)點

image.png
  • 將指向該節(jié)點的引用改為null

8.9.2 情況2:刪除有一個子節(jié)點的節(jié)點

image.png
  • 父節(jié)點直接指向子樹的根
  • 注意應用引用使得移動整棵子樹非常容易,實際上蚀瘸,它們只是概念上的移動狡蝶,并沒有真實的移動。

8.9.3 情況3:刪除有兩個子節(jié)點的節(jié)點

  1. 對于有兩個子節(jié)點的簡單情況:用中序后繼替代


    image.png
  2. 后繼是右子節(jié)點:右子節(jié)點子樹上移


    image.png
  1. 后繼是右子節(jié)點的左子后代


    image.png

8.10 二叉樹的效率

  • 樹的大部分操作都需要從上到下一層一層地查找某個節(jié)點
  • 樹對所有常用的數據存儲操作都有很高的效率
  • 遍歷不如其他操作快

8.11 用數組表示樹

  • 按從左到右的順序存儲樹的每一層贮勃,下標為0的節(jié)點是根
  • 樹中的每個位置贪惹,無論是否存在節(jié)點,都對應數組中的一個位置
  • 大多數情況下用數組表示樹不是很有效率

8.12 重復關鍵字

  • 有重復關鍵字的節(jié)點都插到與它關鍵字相同的節(jié)點的右子節(jié)點

8.13 完整的tree.java程序

8.14 哈夫曼(Huffman)編碼

  • 二叉樹并不全是搜索樹衙猪,很多二叉樹用于其他的情況

8.14.1 字符編碼

  • 計算機里每個字符在沒有壓縮的文本文件中由一個字節(jié)(ASCII碼)馍乙,或兩個字節(jié)(Unicode碼)
  • 有很多壓縮數據的方法布近。對文本來說,最常用的方法是減少表示最常用字符的位數量
  • 每個代碼都不能是其他代碼的前綴

8.14.2 用哈夫曼樹解碼

  • 哈夫曼樹用于壓縮文本
  • 從根開始丝格,如果遇到0就向左走撑瞧,遇到1就向右走

8.14.3 創(chuàng)建哈夫曼樹

8.14.4 信息編碼

8.14.5 創(chuàng)建哈夫曼編碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市显蝌,隨后出現的幾起案子预伺,更是在濱河造成了極大的恐慌,老刑警劉巖曼尊,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酬诀,死亡現場離奇詭異,居然都是意外死亡骆撇,警方通過查閱死者的電腦和手機瞒御,發(fā)現死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來神郊,“玉大人肴裙,你說我怎么就攤上這事∮咳椋” “怎么了蜻懦?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夕晓。 經常有香客問我宛乃,道長,這世上最難降的妖魔是什么蒸辆? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任征炼,我火速辦了婚禮,結果婚禮上吁朦,老公的妹妹穿的比我還像新娘柒室。我一直安慰自己,他們只是感情好逗宜,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布雄右。 她就那樣靜靜地躺著,像睡著了一般纺讲。 火紅的嫁衣襯著肌膚如雪擂仍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天熬甚,我揣著相機與錄音逢渔,去河邊找鬼。 笑死乡括,一個胖子當著我的面吹牛肃廓,可吹牛的內容都是我干的智厌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盲赊,長吁一口氣:“原來是場噩夢啊……” “哼铣鹏!你這毒婦竟也來了?” 一聲冷哼從身側響起哀蘑,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诚卸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绘迁,有當地人在樹林里發(fā)現了一具尸體合溺,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年缀台,在試婚紗的時候發(fā)現自己被綠了棠赛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡将硝,死狀恐怖恭朗,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情依疼,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布而芥,位于F島的核電站律罢,受9級特大地震影響,放射性物質發(fā)生泄漏棍丐。R本人自食惡果不足惜误辑,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歌逢。 院中可真熱鬧巾钉,春花似錦、人聲如沸秘案。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阱高。三九已至赚导,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赤惊,已是汗流浹背吼旧。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留未舟,地道東北人圈暗。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓掂为,卻偏偏與公主長得像,于是被迫代替她去往敵國和親员串。 傳聞我的和親對象是個殘疾皇子勇哗,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • 一些概念 數據結構就是研究數據的邏輯結構和物理結構以及它們之間相互關系,并對這種結構定義相應的運算昵济,而且確保經過這...
    Winterfell_Z閱讀 5,817評論 0 13
  • 算法的意義在于讓代碼可行智绸、高效、低占用資源访忿。明白代碼底層邏輯瞧栗,方便使用和閱讀代碼。 算法就是任何明確定義的計算過程...
    apricoter閱讀 2,104評論 0 3
  • 1. 鏈表 鏈表是最基本的數據結構海铆,面試官也常常用鏈表來考察面試者的基本能力迹恐,而且鏈表相關的操作相對而言比較簡單,...
    Mr希靈閱讀 1,444評論 0 20
  • 本文采用Java語言來進行描述卧斟,幫大家好好梳理一下數據結構與算法殴边,在工作和面試中用的上。亦即總結常見的的數據結構珍语,...
    編程小世界閱讀 333評論 0 0
  • 今日小小編推薦 「木槿花? 復古連衣裙」 散落于衣身的木槿花 讓溫柔的氣氛極盡蔓延 復古西服領 小包扣 散開的裙擺...
    SteFaninininie閱讀 185評論 0 0