Skip to content

Commit

Permalink
Merge pull request #12 from kartiksubbarao/master
Browse files Browse the repository at this point in the history
Fix tree_insert() duplicate detection logic, resolves #11
  • Loading branch information
MarcJHuber committed Oct 16, 2022
2 parents 4d4d9fa + 9540988 commit b607b82
Showing 1 changed file with 21 additions and 23 deletions.
44 changes: 21 additions & 23 deletions misc/rb.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,32 +182,30 @@ static void right_rotate(rb_tree_t * T, rb_node_t * x)

static int tree_insert(rb_tree_t * T, rb_node_t * z)
{
rb_node_t *x, *y;
y = rb_nil;
x = T->root;
while (x != rb_nil) {
y = x;
if (T->compare(z->payload, x->payload) < 0)
x = x->left;
else
x = x->right;
}
z->parent = y;
if (y == rb_nil)
T->root = z;
else {
int i = T->compare(z->payload, y->payload);
if (i < 0)
y->left = z;
else if (i > 0)
y->right = z;
else {
return 0; /* Duplicate! */
rb_node_t *x, *y;
y = rb_nil;
x = T->root;
while (x != rb_nil) {
y = x;
int i = T->compare(z->payload, x->payload);
if (i < 0)
x = x->left;
else if (i > 0)
x = x->right;
else {
#ifdef DEBUG_RB
fprintf(stderr, "dupe! %p\n", z->payload);
fprintf(stderr, "dupe! %p\n", z->payload);
#endif
return 0; /* Duplicate! */
}
}
}
z->parent = y;
if (y == rb_nil)
T->root = z;
else if (T->compare(z->payload, y->payload) < 0)
y->left = z;
else
y->right = z;
z->prev = tree_predecessor(z);
if (z->prev != rb_nil) {
z->next = z->prev->next;
Expand Down

0 comments on commit b607b82

Please sign in to comment.