Алгоритм вставки элемента в 2-3 - дерево
T23_Insert (root, k, data)//
1
k
–ключ
2 data - данные
3 root – корень 2-3 дерева
3 Создание узла листа с ключом k и данными data - lt
4 if дерево пусто
5 then создание внутреннего узла - корня - root
6 son1[root] ← lt
7 return TRUE
8 if корень имеет одного сына
9 then if key[son1] < k
10 then прикрепить узел lt вторым сыном корня root
11 return TRUE
12 else if key[son1] > k
13 then прикрепить узел lt первым сыном корня root
14 return TRUE
15 else k совпадает с key[son1]
16 уничтожить узел - лист lt
17 return FALSE
18 корень root имеет 2 и 3 сына
19 inserted ← Insert1(root, lt, tbk, lbk)
20 if inserted = TRUE вставка произошла
21 then if tbk ≠ nil у корня создан новый брат tbk
22 then создание нового корня root1
23 son1[root1] ← старый корень root
24 son2[root1] ← tbk
25 назначить root1 новым корнем дерева
26 return inserted
T23_Insert1(t, lt, tnew, low)
1 t – текущий узел 2-3 дерева
2 lt – новый узел
3 tnew – возвращаемый адрес нового узла - брата узла t
4 low – возвращаемый минимальный ключ в поддереве нового узла tnew
5 tnew ← nil
6 if t - лист
7 then if key[t] = key [lt]
8 then return FALSE
9 else tnew ← t или lt с большим ключом
10 low ← больший из key[t] и key[lt]
11 return TRUE
12 t - внутренний узел
13 выбрать w – сына t узла для вставки lt
14 inserted ← T23_Insert1(w, lt, tbk, lbk)
15 if inserted = TRUE and tbk ≠ nil
16 then вставка tbk среди сыновей узла t, справа от w
17 if t имеет 4 сына
18 then создание нового внутреннего узла tnew
19 перенос двух правых сыновей из t в tnew
20 low ← минимальный ключ первого сына tnew
21 return inserted
Удаление элемента из 2 – 3 дерева
Если при удалении узла x у родителя - у останется один сын и узел у является корнем, то родитель удаляется из дерева, а корнем становится его единственный сын. Пусть родитель не является корнем. Тогда, если братья узла у имеют трех сыновей, то один из этих сыновей передаются узлу у, и у него становится двое сыновей. Если братья имеют двух сыновей, то единственный сын узла у передается одному из братьев в качестве третьего сына. Узел у после этого удаляется. Если после этого у родителя удаленного узла у останется один сын, то процесс перестройки повторяется для него.
Алгоритм удаления элемента из 2-3 - дерева
T23_ Delete (root, k)
1 if дерево пусто
2 then return FALSE
3 if корень имеет одного сына
4 then if key[son1[root]] = k
5 then уничтожение первого сына корня
6 уничтожение корня
7 root ← nil
8 return TRUE
9 else return FALSE
10 deleted ← T23_Delete1(root, k, tmin, one)
11 if deleted = TRUE
12 then if one = TRUE
13 корень остался с одним сыном
14 then if son1[root] не лист
15 then уничтожение корня root
16 назначение son1[root] корнем дерева
17
else
if
tmin
nil
tmin
- лист с минимальным ключом в поддереве
18 then корректировка границ поиска в корне - low2[root] или low3[root]
19 return deleted
T23_Delete(t, k, tmin, one )
1 t – текущий узел рекурсии
2 k – ключ удаляемого узла
3 tmin - возвращаемый адрес листа с минимальным ключом в поддереве
4 one - возвращаемый признак узла с одним сыном
5 tmin ← nil
6 one ← FALSE
7 if сыновья узла t – листья
8 then if t имеет сына с ключом k
9 then удаление сына с ключом k
10 tmin ←адрес первого сына узла t
11 if t имеет одного сына
12 then one←TRUE
13 else one← FALSE
14 return TRUE
15 else return FALSE
16 t – внутренний узел, сыновья которого - не листья
17 выбрать w – сына узла t
18 deleted ← T23_Delete(w, k, tmin_bk, one_bk) = FALSE
19 if deleted = TRUE
20 then
21 tmin ← tmin_bk
22 if tmin_bk ≠ nil и w – второй или третий сын узла t
23 then корректировка low2[t] или low3[t] соответственно
24 tmin ← nil
25 if one_bk = TRUE
26 then w остался с одним сыном
27 if w – первый сын узла t
28 then if y – второй сын узла t имеет 3-х сыновей
29 then 1-й сын y делается 2-м сыном узла w
30 else сын узла w делается 1-м сыном узла y
31 удаление узла w из сыновей узла t
32 if t имеет одного сына
33 then one ← TRUE
34 else one ← FALSE
35 if w – второй сын узла t
36 then if y – первый сын узла t имеет 3-х сыновей
37 then 3-й сын узла y делается 1-м сыном узла w
38 one ← FALSE
39 if z – третий сын узла t имеет 3-х сыновей
40 then 1-й сын узла z делается 2-м сыном узла w
41 one ← FALSE
42 первый и третий сыновья узла t имеют 2-х сыновей
43 сын узла w делается 3-м сыном первого сына узла t-y
44 удаление w из сыновей узла t
45 if t имеет одного сына
46 then one ← TRUE
47 else one ← FALSE
48 w – третий сын узла t
49 one ← FALSE
50 if y – второй сын узла t имеет 3-х сыновей
51 then 3-й сын узла y делается 1-м сыном узла w
52 else узел y имеет 2-х сыновей
53 сын w делается 3-м сыном узла у
54 удаление w из сыновей
55 return deleted
