@@ -106,12 +106,12 @@ namespace alg {
106
106
int32_t i = 0 ;
107
107
while (i<x->n && k > x->key [i]) i++;
108
108
109
- if (i<x->n && k == x->key [i]) {
109
+ if (i<x->n && k == x->key [i]) { // search in [0,n-1]
110
110
return i;
111
- } else if (x->flag & LEAF) {
111
+ } else if (x->flag & LEAF) { // leaf, no more childs
112
112
return -1 ;
113
113
} else {
114
- std::auto_ptr<node_t > xi (READ (x, i));
114
+ std::auto_ptr<node_t > xi (READ (x, i)); // in last child
115
115
return search (xi.get (), k);
116
116
}
117
117
}
@@ -121,8 +121,8 @@ namespace alg {
121
121
*/
122
122
void insert_nonfull (node x, int32_t k) {
123
123
int32_t i = x->n -1 ;
124
- if (x->flag & LEAF) {
125
- while (i>=0 && k <x->key [i]) {
124
+ if (x->flag & LEAF) { // insert into leaf
125
+ while (i>=0 && k < x->key [i]) { // shift from right to left, when k < key[i]
126
126
x->key [i+1 ] = x->key [i];
127
127
i = i - 1 ;
128
128
}
@@ -173,28 +173,26 @@ namespace alg {
173
173
z->n = T - 1 ;
174
174
175
175
int32_t j;
176
- for (j=0 ;j<T-1 ;j++) { // init z
176
+ for (j=0 ;j<T-1 ;j++) { // init z, t-1 keys
177
177
z->key [j] = y->key [j+T];
178
178
}
179
179
180
- if (!(y->flag & LEAF)) {
180
+ if (!(y->flag & LEAF)) { // if not leaf, copy childs too.
181
181
for (j=0 ;j<T;j++) {
182
182
z->c [j] = y->c [j+T];
183
183
}
184
184
}
185
185
186
- y->n = T-1 ; // splited y
186
+ y->n = T-1 ; // shrink y to t-1 elements
187
187
WRITE (y.get ());
188
188
WRITE (z.get ());
189
189
190
- for (j=x->n ;j>=i+1 ;j--) {
191
- x->c [j+1 ] = x->c [j]; // shift
190
+ for (j=x->n ;j>=i+1 ;j--) { // make place for the new child in x
191
+ x->c [j+1 ] = x->c [j];
192
192
}
193
193
194
- // save z
195
- x->c [i+1 ] = z->offset ;
196
-
197
- for (j=x->n -1 ;j>=i;j--) {
194
+ x->c [i+1 ] = z->offset ; // make z the child of x
195
+ for (j=x->n -1 ;j>=i;j--) { // move keys in x
198
196
x->key [j+1 ] = x->key [j];
199
197
}
200
198
x->key [i] = y->key [T-1 ];
0 commit comments