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;
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.
}
}
}
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);
+ }
}