From 4a2ea18a51a065539e55462c34445cea3e389283 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Mon, 2 Oct 2000 11:47:30 +0000 Subject: [PATCH] Deletion case 2c can shift the root; case 3b is not the only case that can do that. The bad case happens when you have a root node containing only one actual element, and its two child nodes have only one element each, and you try to delete the element in the root. [originally from svn r660] --- tree234.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tree234.c b/tree234.c index 8101c78b..f97837a1 100644 --- a/tree234.c +++ b/tree234.c @@ -569,6 +569,17 @@ void del234(tree234 *t, void *e) { } n->elems[j] = NULL; n->kids[j+1] = NULL; + /* + * It's possible, in this case, that we've just removed + * the only element in the root of the tree. If so, + * shift the root. + */ + if (n->elems[0] == NULL) { + LOG((" shifting root!\n")); + t->root = a; + a->parent = NULL; + sfree(n); + } /* * Now go round the deletion process again, with n * pointing at the new big node and e still the same. -- 2.45.2