1
+
1
2
/**
2
- * Класс реализует структуру данных "2-3-дерево" .
3
- * Такая структура хранит элементы в виде древовидной структуры, но сбалансированные .
3
+ * Implements the "2-3-tree" data structure .
4
+ * The structure stores elements in the form of a tree, but balanced .
4
5
*/
5
- class Tree23 <T extends Comparable <T >> {
6
+ class Tree23 <T extends Comparable <T >> {
6
7
7
8
private static final int ROOT_IS_BIGGER = 1 ;
8
9
private static final int ROOT_IS_SMALLER = -1 ;
9
10
10
- private Node root ; // Корень дерева
11
- private int size ; // Количество элементов дерева
12
- private boolean addition ; // Флаг, чтобы знать, был ли последний элемент добавлен правильно или нет
11
+ private Node root ; // Tree root
12
+ private int size ; // The number of tree elements
13
+ private boolean addition ; // Tracks if the last item was added correctly or not.
13
14
14
15
Tree23 () {
15
16
this .root = new Node ();
16
17
this .size = 0 ;
17
18
}
18
19
19
20
/**
20
- * @return true, если дерево пусто, иначе false
21
+ * @return true, the tree is empty, otherwise false
21
22
*/
22
23
public boolean isEmpty () {
23
24
if (root == null ) return true ;
24
25
return root .getLeftElement () == null ;
25
26
}
26
27
27
28
/**
28
- * Метод, для проверки, содержится ли данный узел в дереве
29
+ * Check if the given element is in the tree
29
30
*
30
- * @param element элемент для поиска
31
- * @return true, если это дерево содержит указанный элемент, иначе false
31
+ * @param element the element to check
32
+ * @return true, if the element is found, otherwise false
32
33
*/
33
34
public boolean contains (T element ) {
34
35
return search (element );
35
36
}
36
37
37
38
/**
38
- * @return кол-во элементов дерева
39
- */
39
+ * @return number of elements in the tree */
40
40
public int size () {
41
41
return size ;
42
42
}
43
43
44
44
/**
45
- * Метод, для добавления нового элемента в дерево, сохраняя его сбалансированным
45
+ * Adds a new element to the tree, keeping it balanced
46
46
*
47
- * @param element элемент для добавления
47
+ * @param element item to add
48
48
*/
49
49
public void add (T element ) {
50
50
51
51
size ++;
52
52
addition = false ;
53
53
54
- if (root == null || root .getLeftElement () == null ) { // первый случай
54
+ if (root == null || root .getLeftElement () == null ) { // first case
55
55
if (root == null ) {
56
56
root = new Node ();
57
57
}
@@ -69,30 +69,30 @@ public void add(T element) {
69
69
}
70
70
71
71
/**
72
- * @param current узел, в который нужно добавить
73
- * @param element элемент для вставки
72
+ * @param current node to add to
73
+ * @param element item to add
74
74
*/
75
75
private Node add (Node current , T element ) {
76
76
77
77
Node newParent = null ; // узел, который будет добавлен
78
78
79
- /* мы еще не на самом глубоком уровне */
79
+ /* we are not yet at the deepest level */
80
80
if (!current .isLeaf ()) {
81
81
82
82
Node newNode ;
83
83
84
- /* такой элемент уже существует */
84
+ /* element already exists */
85
85
if (current .leftElement .compareTo (element ) == 0 || (current .is3Node () && current .rightElement .compareTo (element ) == 0 )) {
86
86
}
87
87
88
- // newNode меньше левого элемента
88
+ // newNode < left element
89
89
else if (current .leftElement .compareTo (element ) == ROOT_IS_BIGGER ) {
90
90
newNode = add (current .left , element );
91
91
92
- // newNode приходит из левой ветви
92
+ // newNode comes from the left branch
93
93
if (newNode != null ) {
94
94
95
- // newNode, в этом случае, всегда меньше, чем current.left
95
+ // newNode < than current.left
96
96
if (current .is2Node ()) {
97
97
current .rightElement = current .leftElement ; // сдвинуть текущий левый элемент вправо
98
98
current .leftElement = newNode .leftElement ;
@@ -101,19 +101,19 @@ else if (current.leftElement.compareTo(element) == ROOT_IS_BIGGER) {
101
101
current .left = newNode .left ;
102
102
}
103
103
104
- // В этом случае у нас новое разделение, поэтому текущий элемент слева будет подниматься
104
+ // we have a new division, so the current element on the left will rise
105
105
else {
106
106
107
- // копируем правую часть поддерева
107
+ // copy the right side of the subtree
108
108
Node rightCopy = new Node (current .rightElement , null , current .mid , current .right );
109
109
110
- // создаем новую «структуру», вставляя правую часть
110
+ // create a new “structure” by inserting the right side
111
111
newParent = new Node (current .leftElement , null , newNode , rightCopy );
112
112
}
113
113
}
114
114
}
115
115
116
- // newNode больше левого и меньше правого
116
+ // newNode is > left and < right
117
117
else if (current .is2Node () || (current .is3Node () && current .rightElement .compareTo (element ) == ROOT_IS_BIGGER )) {
118
118
119
119
newNode = add (current .mid , element );
@@ -589,4 +589,4 @@ private void postOrder(Node current) {
589
589
}
590
590
}
591
591
592
- }
592
+ }
0 commit comments