2-3-4 Tree的加入

Download Report

Transcript 2-3-4 Tree的加入

2-3 tree 與2-3-4 tree
授課老師:蕭志明
2-3 tree
一棵 2-3 樹必須符合下列幾項定義:
(1) 2-3 tree 中的節點可以存放一筆或兩筆資料。
(2) 若節點中存放了一筆資料 Ldata.key ,其必須存在
兩個子節點-左子節點與中子節點。假設資料 Ldata
的鍵值為 Ldata.key ,則:
(a) 左子節點所存放的資料鍵值必須小於 Ldata.key 。
(b) 中子節點存放的資料鍵值必須大於 Ldata.key 。
2
2-3 tree
(3) 若節點中存放了兩筆資料 Ldata 與 Rdata ,則會存在三個
子節點-左子節點、中子節點與右子節點。假設資料 Ldata 、
Rdata 的鍵值分別為 Ldata.key 與 Rdata.key,則:
(a) Ldata.key < Rdata.key 。
(b) 左子節點所存放的資料鍵值必須小於 Ldata.key 。
(c) 中子節點所存放的資料鍵值必須大於 Ldata.key 和小於 Rdata.key 。
(d) 右子節點所存放的資料鍵值必須大於 Rdata.key 。
(4) 樹中的所有樹葉節點必須為同一階度 ( Level ) 。
3
2-3 tree特性
(1) 有 n 個元素的 2-3 tree 之高度介於
[ log3( n+1 ) ] 和 [ log2( n+1 ) ]。
(2) 在高度為 h 的 2-3 tree 中,元素的個數介
於 2h - 1 到 3h - 1 。
(3) 在 n 個元素的 2-3 tree 中,插入和刪除需
要時間為 O( log n ) 。
4
2-3 tree
依序加入60,90,55,15,25,17
5
2-3 tree的加入
從2-3 Tree的開始搜尋,假使加入的資料其鍵值在2-3
Tree中找不到,則加入2-3 Tree中:
1. 該節點只有一筆資料,則直接加入。
2. 該節點已存在兩筆資料,加入後不符合2-3 tree的定
義,因此必須將此節點一分為二,並將中間的鍵值,
往上提到父節點。
f
6
f
2-3 tree的加入
(2)承(1)加入90 ,由於g節點已有兩個鍵值 80與85,因此必須將g節點劃分為
g, h 兩個節點,然後將85加入其父節點c中,因為85介於80和90之間
加入90
7
2-3 tree的加入
8
(3)承(2)加入55。
加入55
9
2-3 tree的加入
(4)承(3)加入15
加入15
10
2-3 tree的加入
(5)承(4)加入25
加入25
11
2-3 tree的加入
(6)承(5)加再加入17以同樣方法,其結果如下所
示:
加入17
12
2-3 tree的刪除
2-3 Tree的刪除分成兩部份:
一為刪除的鍵值是在樹葉節點上(leaf node)。
刪除下圖中的10,85,90,80
二為刪除的鍵值是在非樹葉節點(non-leaf node)。
刪除下圖中的60,70,90,95,75
13
2-3 tree的刪除
1. 若刪除的鍵值是在樹葉節點上:
(1)今欲刪除圖10-2中節點d的鍵值10,則
可直接刪除之,因為刪除後還有一個,
故還符合2-3 Tree的定義。
刪除10
14
2-3 tree的刪除
(2)假設我們要刪除的是圖10-2中節點g的鍵值85,此時不可直接刪除之,我
們必需向左或右兄弟節點借一個鍵值,一般而言我都先向右邊的節點借,
若右邊節點沒有,再向左邊節點借,這不是絕對的順序。ok,若我們向右
邊的節點h借,則需借一個最小的鍵值95(為什麼?),然後以g節點之父
節點c中的鍵值90(挑介於 85和95之間的鍵值)取代刪除的85,並將95
往上提到c節點上。最後結果如下圖所示:
刪除85
15
2-3 tree的刪除
16
2-3 tree的刪除
承上若繼續刪除90,則右兄弟節點沒有多餘的鍵值,而左兄弟
節點有一個以上的鍵值,因此向左兄弟節點借一個最大值75,
往上提至父節點,並將父節點的80(因為它介於75和90之間)
取代90,最後結果如下圖所示:
刪除90
17
2-3 tree的刪除
承上繼續刪除80的話,則因為它的左右兄弟節點皆無一個以上
的鍵值,此時必需挑左或右兄弟與其父節點的某一鍵值合併:
刪除80
如挑右兄弟節點和父節點合併結果
18
若挑左兄弟節點和父節點合併
2-3 tree的刪除
2. 刪除的鍵值在非樹葉節點上:
若此時欲刪除的圖10-2中a節點的鍵值60.則可以找此節點之
右子樹中最小的鍵值來取代,或找左子樹中最大的鍵值來取
代之,若以右子樹中最小的鍵值來取代的話,則f節點的70將
取代60,如下圖所示:
刪除60
19
2-3 tree的刪除
20
2-3 tree的刪除
承上再刪除70鍵值
刪除70
21
2-3 tree的刪除
承上再刪除90
刪除90
22
2-3 tree的刪除
承上再刪除95
刪除95
23
2-3 tree的刪除

承上若再刪除75,若以右子樹中的80取代的話後,情形如
下圖所示:
刪除75
則此不符合2-3 tree的定義,因為有一節點沒有鍵值故需再調整之,最後如下圖所示:
24
2-3 tree的刪除
 若以左子樹中的50取代的話,則結果如下圖所示:
刪除75
這好比在刪除50的樹葉節點一般,其實我們可以在刪
除非樹葉節點的鍵值時,隨機的挑選以右子樹的最小
值或左子樹的最大值交換的應用。
25
2-3-4 Tree
一棵2-3-4 Tree必須符合下列定義:
1.2-3-4 Tree中的節點可以存放一筆、兩筆或三筆資料。
2.若節點中存放了一筆資料Ldata,其必須存在兩個子節點-
左子節點與左中子節點,而且
(1)左子節點所存放的資料必須小於Ldata;
(2)左中子節點存放的資料必須大於Ldata。
26
2-3-4 Tree
3. 若節點中存放了兩筆資料Ldata與Mdata,則會存在
三個子節點-左子節點、左中子節點與右中子節點。
(1)Ldata<Mdata;
(2)左子節點所存放的資料必須小於Ldata;
(3)左中子節點所存放的資料必須大於Ldata,小於Mdata;
(4)右中子節點所存放的資料必須大於Mdata。
27
2-3-4 Tree
4.若節點中存放了三筆資料Ldata、Mdata與Rdata,則
會存在四個子節點-左子節點、左中子節點、右中子
節點與右子節點。
(1)Ldata < Mdata < Rdata;
(2)左子節點所存放的資料必須小於Ldata;
(3)左中子節點所存放的資料必須大於Ldata,小於Mdata;
(4)右中子節點所存放的資料必須大於Mdata,小於Rdata;
(5)右子節點所存放的資料必須大於Rdata。
5.樹中的所有樹葉節點必須為同一階度(Level)。
28
2-3-4 Tree特性
(1) 有 n 個元素的 2-3-4 tree ,其高度介於 ┌
log4(n+1) ┐和 ┌ log2(n+1) ┐。
(2) 在 n
個元素的 2-3-4 tree 中,插入和刪除需要時間
為 O( logn ) 。
29
2-3-4 Tree的加入
2-3-4 Tree的加入與2-3 Tree十分類似,假設
存在一2-3-4 Tree,如下圖所示:
加入60
30
2-3-4 Tree的加入
承上再加入70於d節點
加入70
31
2-3-4 Tree的加入
承上再加入95
加入95
32
2-3-4 Tree的加入
承上再加入75
加入75
33
2-3-4 Tree的加入
 由於e節點不符合2-3-4 Tree的定義,故需加
以調整之,將80提至父節點a中,並將e分為
二,如下所示:
調整
34
2-3-4 Tree的加入
 但此時a亦是不符合2-3-4 Tree的定義,故繼
續調整之,最後的結果如下圖所示:
調整
35
2-3-4 Tree的刪除
此動作與2-3 Tree相同,底下介紹2-3-4 Tree
刪除樹葉節點的方法,若刪除70 :
刪除70
36
2-3-4 Tree的刪除
刪除20
刪除20
37
2-3-4 Tree的刪除
刪除30
刪除20
38