Transcript 下載/瀏覽
二三樹 (2-3 Trees) 二技晶片四甲 19637048 林宥鈞 何謂2-3 Tree –若不是空集合,則要符合下列的定義。 –2-3 Tree中的節點可以存放一筆或兩筆資料。 –若節點中存放了一筆資料Ldata,其必須存在兩個子點節- 左子節點與中子節點。 2-3 Tree定義 –左子節點所存放的資料鍵值必須小於Ldata.key。 –中子節點所存放的資料鍵值必須大於Ldata.key。 Ldata 左子節點 中子節點 2-3 Tree 存放了兩筆資料Ldata與Rdata (1) Ldata < Rdata (2)左子節點所存放的資料必須小於Ldata (3)中子節點所存放的資料必須大Ldata, 小於Rdata (4)右子節點所存放的資料必須大於Rdata 2-3 Tree定義 樹中的所有樹葉節點必須為同一階(Level)。 Ldata, Rdata 左子節點 中子節點 右子節點 2-3 Tree的加入 • 從2-3 Tree的開始搜尋,假使加入的資料其鍵值在2-3 Tree中找不到,則加入2-3 Tree中。 • 假設加入的節點, –該節點只有一筆資料,則直接加入; –該節點已存在兩筆資料,加入後不符合2-3 tree的定 義,因此必須將此節點資料一分為二,分別放入最大 鍵值和最小鍵值並將中間的鍵值,往上放到父節點。 2-3 Tree的加入 • 該節點的父節點也已有二筆資料。 a 45 d 10,20 加入60於左下圖 b c 30 70 e 40 f 50 50,60 g 80,85 2-3 Tree的加入 繼續加入90 然後將85加入,因 為85介於80和90之 間。 a 45 d 10,20 b c 30 70 e 40 f 50,60 g 80, 85 ,90 2-3 Tree的加入 •繼續加入55加入c節點 a 45 b c 30 d 10,20 70,85 e 40 f 50,60 g 80 h 90 2-3 Tree的加入 a •並將70加入其父節點a 45 b c 30 d 10,20 70,85 e 40 f g 50,55,60 80 h 90 2-3 Tree的加入 a 繼續加入15 45,70 c b 55 30 d 10,20 j f e 40 50 85 i g h 60 80 90 2-3 Tree的加入 a 45,70 c b 55 30 d 10,15,20 j f e 40 50 85 i g h 60 80 90 2-3 Tree的加入 a 繼續加入25 45,70 c b 55 15,30 d k 10 20 j f e 40 50 85 i g h 60 80 90 2-3 Tree的加入 a 繼續加入17 45,70 c b 55 15,30 d 10 k 20,25 j f e 40 50 85 i g h 60 80 90 2-3 Tree的加入 45,70 c 20 b 55 15,30 d 10 k j f e 17,20,25 40 50 85 i g h 60 80 90 2-3 Tree的加入 p 45 a n 20 70 b 15 d 10 j m 30 j 55 k y e 17 25 40 f 50 85 i g h 60 80 90 2-3 Tree的刪除 •Tree的刪除分成兩部份: 一為刪除的鍵值是在樹葉節點上 二為刪除的鍵值是在非樹葉節點 2-3 Tree的刪除 • 若刪除的鍵值是在 樹葉節點上 a 60 35 d 15 • 今欲刪除左圖中節 點f的鍵值70 c b 80,90 e 50 f 70,75 g 85 h 95,96 2-3 Tree的刪除 若繼續刪除85 a 60 c b 35 d 15 80,90 e 50 f 75 g 85 h 95,96 2-3 Tree的刪除 •假設我們要刪除的是圖中節點g的鍵值85, 此時不可直接刪除就結束(why?) •我們必需向左或右兄弟節點借一個鍵值。 •若我們向右邊的節點h借,則需借一個最小的鍵值 95(為什麼?),取代刪除的85,並將95往上提到 c節點上。最後結果如下圖所示: 2-3 Tree的刪除 a 60 c b 35 d 15 80,90 e 50 f 70,75 g 85 h 95,96 2-3 Tree的刪除 若繼續刪除90,左兄弟節點 借一個最大值75,往上提至 父節點,並將父節點的80 (因為它介於75和90之間) 取代90 a 60 c b 35 d 15 80,95 e 50 f 70,75 g 90 h 96 2-3 Tree的刪除 a 60 c b 35 d 15 80,95 e 50 f 70,75 g 90 h 96 2-3 Tree的刪除 a 60 c b 35 d 15 75,95 e 50 f 70 g 80 h 96 繼續刪除80的話,則 因為它的左右兄弟節 點皆無一個以上的鍵 值,此時必需挑左或 右兄弟與其父節點的 某一鍵值合併 2-3 Tree的刪除 a 60 d 15 b c 35 75 e 50 f 70 h 95,96 2-3 Tree的刪除 • 刪除的鍵值在非樹葉節點上 •若此時欲刪除下圖中a節點的鍵值60.則可 以找此節點之右子樹中最小的鍵值來取代, 或找左子樹中最大的鍵值來取代之,若以 右子樹中最小的鍵值來取代的話,則f節點 的70將取代60,如右下圖所示。 2-3 Tree的刪除 a 60 c b 35 d 15 80,90 e 50 f 70,75 g 85 h 95,96 2-3 Tree的刪除 繼續再刪除70鍵值, 找右子樹中最小的鍵 值 75 來取代之,並 進行前述的處理, a 70 c b 35 d 15 80,90 e 50 f 75 g 85 h 95,96 2-3 Tree的刪除 繼續再刪除90,找右子樹 中最小的鍵值 95 來取代 之 a 75 c b 90 35 d 15 e 50 f 80,85 h 95,96 2-3 Tree的刪除 a 繼續再刪除95,以 左子樹中最大的鍵 值來取代之 75 c b 95 35 d 15 e 50 h f 80,85 96 2-3 Tree的刪除 若繼續再刪75,若 以右子樹中80取代 的話後,情形如下 圖示: a 75 c b 85 35 d 15 e 50 h f 80 96 2-3 Tree的刪除 刪除80的樹葉節點一般,隨機的挑 選以右子樹的最小值或左子樹的最 大值交換的應用。 a 80 c b ? 35 d 15 10,15 e h 50 85,96 右圖不符合2-3 tree的定義, 因為有一節點沒有鍵值故需再 調整之,方法如下圖所示: 2-3 Tree的刪除 刪除80的樹葉節點一般,隨機的挑 選以右子樹的最小值或左子樹的最 大值交換的應用。 a 80 c b ? 35 d e h 10,15 50 85,96 右圖不符合2-3 tree的定義, 因為有一節點沒有鍵值故需再 調整之,方法如下圖所示: 2-3 Tree的刪除 左圖不符合2-3 tree的定義,因為 有一節點沒有鍵值故需再調整之, 方法一: 如右圖所示: 35,80 50 10,15 85,96 50 方法二:若以左子樹中 的50取代的話,則結 果如右圖所示: 85 15 10 35 80 96 2-3 Tree結論 •資料也常有搜尋的需求,tree才是常見的搜尋結 構。 •tree可以用陣列來表示,也可以用鏈結串列來表 示。 •寫程式的人可選擇效率比較好的方式來實作,一 旦完成了資料結構的實作,未來若是有演算法需 要用到該種資料結構,就可以直接使用,不必再 寫程式。 謝謝指教