]> git.mdlowis.com Git - projs/libcds.git/commitdiff
add pointer to parent
authora bellenir <a@bellenir.com>
Tue, 5 Aug 2014 22:37:22 +0000 (22:37 +0000)
committera bellenir <a@bellenir.com>
Tue, 5 Aug 2014 22:37:22 +0000 (22:37 +0000)
source/rb/rb.c
source/rb/rb.h
tests/test_rb.c

index e667cc0e71a084b4f1b07f7fdbc72262ea2c559a..abb678a0ca66336ed95552df40e701b53ff2c2ed 100644 (file)
@@ -21,6 +21,7 @@ rb_node_t* rb_node_new(int contents){
        rb_node_t* node = mem_allocate(sizeof(rb_node_t), &rb_node_free);
        node->left = NULL;
        node->right = NULL;
+       node->parent = NULL;
        node->contents = contents;
        node->color = RED;
        return node;
@@ -65,6 +66,7 @@ static void rb_tree_insert_node(rb_tree_t* tree,
                if(parent->left){
                        rb_tree_insert_node(tree, node, parent->left, parent, parent->right);
                }else{
+                       node->parent = parent;
                        parent->left = node;
                        rb_tree_recolor(node, parent, grandparent, uncle);
                }
@@ -72,6 +74,7 @@ static void rb_tree_insert_node(rb_tree_t* tree,
                if(parent->right){
                        rb_tree_insert_node(tree, node, parent->right, parent, parent->left);
                }else{
+                       node->parent = parent;
                        parent->right = node;
                        rb_tree_recolor(node, parent, grandparent, uncle);
                }
index 73421d9a4b2873d49900fb98bebcc4619c6762d8..6fac63ac53d9cf10b681c5099bee22fc9a378f94 100644 (file)
@@ -15,6 +15,7 @@ typedef enum {
 typedef struct rb_node_t {
        struct rb_node_t* left;
        struct rb_node_t* right;
+       struct rb_node_t* parent;
        rb_color_t color;
        int contents; /* int for development; TODO: make this a void* */
 } rb_node_t;
index e920c3577e2a328f47802799a220aa1b39022a23..dbd51ab19d7c4115dc254c7e22db3f634478c114 100644 (file)
@@ -17,6 +17,7 @@ TEST_SUITE(RB) {
                CHECK(NULL != node);
                CHECK(NULL == node->left);
                CHECK(NULL == node->right);
+               CHECK(NULL == node->parent);
                CHECK(42 == node->contents);
                CHECK(rb_node_is_valid(node, -1, -1));
                mem_release(node);
@@ -42,6 +43,9 @@ TEST_SUITE(RB) {
                CHECK(NULL != node);
                CHECK(tree->root == node);
                CHECK(42 == node->contents);
+               CHECK(NULL == node->left);
+               CHECK(NULL == node->right);
+               CHECK(NULL == node->parent);
                CHECK(rb_tree_is_valid(tree));
                mem_release(tree);
     }
@@ -52,6 +56,7 @@ TEST_SUITE(RB) {
                CHECK(NULL != root);
                CHECK(NULL != node1);
                CHECK(tree->root == root);
+               CHECK(root == node1->parent);
                CHECK(31 == node1->contents);
                CHECK(node1 == root->left);
                CHECK(NULL == root->right);
@@ -66,6 +71,7 @@ TEST_SUITE(RB) {
                CHECK(NULL != root);
                CHECK(NULL != node2);
                CHECK(tree->root == root);
+               CHECK(root == node2->parent);
                CHECK(64 == node2->contents);
                CHECK(node2 == root->right);
                CHECK(NULL == root->left);
@@ -82,6 +88,8 @@ TEST_SUITE(RB) {
                CHECK(NULL != node1);
                CHECK(NULL != node2);
                CHECK(tree->root == root);
+               CHECK(root == node1->parent);
+               CHECK(root == node2->parent);
                CHECK(31 == node1->contents);
                CHECK(64 == node2->contents);
                CHECK(node1 == root->left);
@@ -91,5 +99,23 @@ TEST_SUITE(RB) {
                CHECK(rb_tree_is_valid(tree));
                mem_release(tree);
     }
+    /*
+    TEST(Verify_rb_insert_below_full_first_level_works){
+               rb_tree_t* tree = rb_tree_new();
+               rb_node_t* root = rb_tree_insert(tree, 42);
+               rb_node_t* node1 = rb_tree_insert(tree, 31);
+               rb_node_t* node2 = rb_tree_insert(tree, 64);
+               rb_node_t* node3 = rb_tree_insert(tree, 15);
+               CHECK(NULL != node3);
+               CHECK(15 == node3->contents);
+               CHECK(node1->left == node3);
+               CHECK(NULL == node3->left);
+               CHECK(NULL == node3->right);
+               CHECK(BLACK == root->color);
+               CHECK(
+               CHECK(rb_tree_is_valid(tree));
+               mem_release(tree);
+    }
+    */
 }