Пример #1
0
void* rb_tree_delete(tree_root* root, void* key){
  tree_node *y, *z, *x, *hold_node_to_delete;
  uint8_t y_original_color;
  void* node_to_return;

  hold_node_to_delete = y = z = __search_rbtree_node(root, key);

  if(y == NULL){
    log(W, "Trying to remove a node from tree that does not exist.");
    return NULL;
  }

  node_to_return = y->node;

  y_original_color = y->color;
  if(z->left == &RBNIL){
    x = z->right;
    __rb_transplant(root, z, z->right);
  }
  else
    if(z->right == &RBNIL){
      x = z->left;
      __rb_transplant(root, z, z->left);
    }
    else{
      y = __rb_tree_minimum(z->right);
      y_original_color = y->color;
      x = y->right;
      if(y->parent == z)
	x->parent = y;
      else{
	__rb_transplant(root, y, y->right);
	y->right = z->right;
	y->right->parent = y;
      }
      __rb_transplant(root, z, y);
      y->left = z->left;
      y->left->parent = y;
      y->color = z->color;
    }
  if(y_original_color == BLACK)
    __rb_tree_delete_fixup(root, x);

  free(hold_node_to_delete);
  return node_to_return;
}
Пример #2
0
void* search_rbtree(const tree_root* root, const void* key){
  tree_node *z = __search_rbtree_node(root, key);
  if(z)
    return z->node;
  return NULL;
}
Пример #3
0
void* search_rbtree(tree_root root, void* key){
  tree_node *z = __search_rbtree_node(root, key);
  if(z)
    return z->node;
  return NULL;
}