From: a bellenir Date: Wed, 6 Aug 2014 22:20:20 +0000 (+0000) Subject: remove root in otherwise empty tree X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=921f1c60f8280ef5fb4f3a8190342adb94070840;p=projs%2Flibcds.git remove root in otherwise empty tree --- diff --git a/source/rb/rb.c b/source/rb/rb.c index 990715e..a2e9728 100644 --- a/source/rb/rb.c +++ b/source/rb/rb.c @@ -174,8 +174,10 @@ static void rb_tree_delete_node(rb_tree_t* tree, rb_node_t* node){ if(node->left && node->right){ //has two children. TODO }else{ + //node has at most one non-leaf child rb_node_t* parent = node->parent; if(RED == node_color(node)){ + //node is red and has only leaf children or tree is invalid. if(node == parent->left) parent->left = NULL; else parent->right = NULL; node->parent = NULL; @@ -203,6 +205,14 @@ static void rb_tree_delete_node(rb_tree_t* tree, rb_node_t* node){ node->right = NULL; node->parent = NULL; mem_release(node); + } else if(node == tree->root){ + //at most one child. no red children :: no children. + tree->root = NULL; + //pointers should already be null. + mem_release(node); + } else { + //node is not root. + //node is black, and has only leaf children or tree is invalid. } } } diff --git a/tests/test_rb.c b/tests/test_rb.c index ea6d9f0..7a97f73 100644 --- a/tests/test_rb.c +++ b/tests/test_rb.c @@ -458,5 +458,19 @@ TEST_SUITE(RB) { mem_release(node1); mem_release(tree); } + TEST(Verify_rb_delete_root_node_with_no_children){ + rb_tree_t* tree = rb_tree_new(); + rb_node_t* node1 = rb_tree_insert(tree, 88); + mem_retain(node1); + rb_tree_delete(tree, 88); + CHECK(1 == mem_num_references(node1)); + CHECK(NULL == tree->root); + CHECK(NULL == node1->left); + CHECK(NULL == node1->right); + CHECK(NULL == node1->parent); + CHECK(rb_tree_is_valid(tree)); + mem_release(node1); + mem_release(tree); + } }