コード例 #1
0
ファイル: rbt.c プロジェクト: abellenir/data-structures
static void rbt_delete_node(rbt_t* tree, rbt_node_t* node){
    rbt_node_t* descendant = NULL;
    if(node->left && node->right){
        descendant = rightmost_descendant(node->left);
        mem_retain(descendant);
        rbt_delete_node(tree, descendant);
        if(node->left) node->left->parent = descendant;
        if(node->right) node->right->parent = descendant;
        descendant->left = node->left;
        descendant->right = node->right;
        descendant->color = node->color;
    }else if(BLACK == rbt_node_color(node)){
        //black node with at most one non-leaf child
        if(RED == rbt_node_color(node->left) || RED == rbt_node_color(node->right)){
            descendant = node->left ? node->left : node->right;
            descendant->color = BLACK;
        } else {
            rbt_del_rebalance(tree, node);
        }
    }
    rbt_node_replace(tree, node, descendant);
    node->left = NULL;
    node->right = NULL;
    node->parent = NULL;
    mem_release(node);
}
コード例 #2
0
int main()
{
  // 测试方法:
  // 插入10个元素,遍历该元素,打印
  int i;
  prbtree root;
  nil =(prbtree)malloc(sizeof(rbtree));
  nil->color = BLACK;
  root = nil;
  int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  int length = sizeof(array)/sizeof(int);
  /* srand(GetTickCount()); */
  randomize_in_place(array, length);  
  print_array(array, length);  
  fflush(stdout);
  for (i = 0; i < length; i++)
    {
      prbtree y = (prbtree)malloc(sizeof(rbt_node));
      construct_node(y, array[i]);
      // print_node(y);
      root = rbt_insert_node(root, y);
      printf ("the %dth iteration\n",i + 1);
      mid_traverse_node(root);
      /* print_node(root); */
      /* printf("%x\n", (unsigned int)root); */
    }
  // mid_traverse_node(root);
  // 测试删除操作
  randomize_in_place(array, length);
  print_array(array, length);
  fflush(stdout);
  for (i = 0; i < length; ++i)
  {
       prbt_node x = rbt_search(root, array[i]);
       root = rbt_delete_node(root, x);
       printf ("the number %d deleted\n",array[i]);
       printf ("the %dth iteration\n",i + 1);
       mid_traverse_node(root);
  }
  return 0;
}
コード例 #3
0
ファイル: rbt.c プロジェクト: abellenir/data-structures
void rbt_delete(rbt_t* tree, void* value){
    rbt_node_t* doomed = rbt_lookup(tree, value);
    if(doomed) rbt_delete_node(tree, doomed);
}