fix the balancing to avoid segmentation faults

This commit is contained in:
krangelov
2021-08-05 16:28:50 +02:00
parent 84789c9fbf
commit 54421492b2

View File

@@ -111,30 +111,42 @@ public:
if (right->right == 0) { if (right->right == 0) {
return new_node(value,0,right); return new_node(value,0,right);
} else { } else {
Namespace<V> new_left =
new_node(value);
return new_node(right->value, return new_node(right->value,
new_node(value), new_left,
right->right); right->right);
} }
} else { } else {
if (right->right == 0) { if (right->right == 0) {
Namespace<V> new_left =
new_node(value);
Namespace<V> new_right =
new_node(right->value);
return new_node(right->left->value, return new_node(right->left->value,
new_node(value), new_left,
new_node(right->value)); new_right);
} else { } else {
if (right->left->sz < 2 * right->right->sz) { if (right->left->sz < 2 * right->right->sz) {
return new_node(right->value, Namespace<V> new_left =
new_node(value, new_node(value,
0, 0,
right->left), right->left);
return new_node(right->value,
new_left,
right->right); right->right);
} else { } else {
return new_node(right->left->value, Namespace<V> new_left =
new_node(value, new_node(value,
0, 0,
right->left->left), right->left->left);
Namespace<V> new_right =
new_node(right->value, new_node(right->value,
right->left->right, right->left->right,
right->right)); right->right);
return new_node(right->left->value,
new_left,
new_right);
} }
} }
} }
@@ -144,20 +156,28 @@ public:
return new_node(value,left,0); return new_node(value,left,0);
} else { } else {
if (right->sz > 3*left->sz) { if (right->sz > 3*left->sz) {
if (right->left->sz < 2*right->right->sz) if (right->left->sz < 2*right->right->sz) {
Namespace<V> new_left =
new_node(value,
left,
right->left);
return new_node(right->value, return new_node(right->value,
new_node(value, new_left,
left,
right->left),
right->right); right->right);
else } else {
return new_node(right->left->value, Namespace<V> new_left =
new_node(value, new_node(value,
left, left,
right->left->left), right->left->left);
Namespace<V> new_right =
new_node(right->value, new_node(right->value,
right->left->right, right->left->right,
right->right)); right->right);
return new_node(right->left->value,
new_left,
new_right
);
}
} else { } else {
return new_node(value,left,right); return new_node(value,left,right);
} }