]> git.mdlowis.com Git - projs/libcds.git/commitdiff
remove root in otherwise empty tree
authora bellenir <a@bellenir.com>
Wed, 6 Aug 2014 22:20:20 +0000 (22:20 +0000)
committera bellenir <a@bellenir.com>
Wed, 6 Aug 2014 22:20:20 +0000 (22:20 +0000)
source/rb/rb.c
tests/test_rb.c

index 990715e926352a7bf518ea462d66c7c121a90fce..a2e9728866b0cfd2ce449800a5cefe02cc8a413e 100644 (file)
@@ -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.
                }
        }
 }
index ea6d9f0f1891adc2d15c611712a58e58549a38cf..7a97f735547f93be8849c839b008c482e36b07bc 100644 (file)
@@ -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);
+       }
 }