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) {
Namespace<V> new_left =
new_node(value,
0,
right->left);
return new_node(right->value, return new_node(right->value,
new_node(value, new_left,
0,
right->left),
right->right); right->right);
} else { } else {
Namespace<V> new_left =
new_node(value,
0,
right->left->left);
Namespace<V> new_right =
new_node(right->value,
right->left->right,
right->right);
return new_node(right->left->value, return new_node(right->left->value,
new_node(value, new_left,
0, new_right);
right->left->left),
new_node(right->value,
right->left->right,
right->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 {
Namespace<V> new_left =
new_node(value,
left,
right->left->left);
Namespace<V> new_right =
new_node(right->value,
right->left->right,
right->right);
return new_node(right->left->value, return new_node(right->left->value,
new_node(value, new_left,
left, new_right
right->left->left), );
new_node(right->value, }
right->left->right,
right->right));
} else { } else {
return new_node(value,left,right); return new_node(value,left,right);
} }