From 54421492b2d02c9b933ed9b903a409149b6ed2bd Mon Sep 17 00:00:00 2001 From: krangelov Date: Thu, 5 Aug 2021 16:28:50 +0200 Subject: [PATCH] fix the balancing to avoid segmentation faults --- src/runtime/c/namespace.h | 66 +++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/src/runtime/c/namespace.h b/src/runtime/c/namespace.h index cad4cebf3..18495f07f 100644 --- a/src/runtime/c/namespace.h +++ b/src/runtime/c/namespace.h @@ -111,30 +111,42 @@ public: if (right->right == 0) { return new_node(value,0,right); } else { + Namespace new_left = + new_node(value); return new_node(right->value, - new_node(value), + new_left, right->right); } } else { if (right->right == 0) { + Namespace new_left = + new_node(value); + Namespace new_right = + new_node(right->value); return new_node(right->left->value, - new_node(value), - new_node(right->value)); + new_left, + new_right); } else { if (right->left->sz < 2 * right->right->sz) { + Namespace new_left = + new_node(value, + 0, + right->left); return new_node(right->value, - new_node(value, - 0, - right->left), + new_left, right->right); } else { + Namespace new_left = + new_node(value, + 0, + right->left->left); + Namespace new_right = + new_node(right->value, + right->left->right, + right->right); return new_node(right->left->value, - new_node(value, - 0, - right->left->left), - new_node(right->value, - right->left->right, - right->right)); + new_left, + new_right); } } } @@ -144,20 +156,28 @@ public: return new_node(value,left,0); } else { if (right->sz > 3*left->sz) { - if (right->left->sz < 2*right->right->sz) + if (right->left->sz < 2*right->right->sz) { + Namespace new_left = + new_node(value, + left, + right->left); return new_node(right->value, - new_node(value, - left, - right->left), + new_left, right->right); - else + } else { + Namespace new_left = + new_node(value, + left, + right->left->left); + Namespace new_right = + new_node(right->value, + right->left->right, + right->right); return new_node(right->left->value, - new_node(value, - left, - right->left->left), - new_node(right->value, - right->left->right, - right->right)); + new_left, + new_right + ); + } } else { return new_node(value,left,right); }