mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-24 03:52:50 -06:00
fix the balancing to avoid segmentation faults
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user