/**
 * 获取红黑树中结点的前驱
 */
prbt_node rbt_precursor(prbt_node current)
{
     prbt_node parent = current->parent;
     if (current->left != nil)
     {
	  return rbt_maximum(current->left);
     }
     else if (parent != nil)
     {
	  while(parent != nil && parent->right != current)
	  {
	       current = parent;
	       parent = parent->parent;
	  }
	  if(parent != nil)
	  {
	       return parent;
	  }
	  else
	  {
	       return nil;
	  }
     }
     else
     {
	  return nil;
     }
}
Esempio n. 2
0
int main(){
    Rbt_tree_link a = rbt_create();
    Rbtlink it;
    srand(time(NULL));

    puts("Inserting...");
    for(i=0;i<N;i++) {
	num[i] = rand() % N;
	rbt_insert(a,num[i]);
    }
    
    printf("rbt_size: %d\n",rbt_size(a));

    printf("min value:%d   max value:%d\n",rbt_item(rbt_minimum(a)),rbt_item(rbt_maximum(a)));
    puts("Doing assert...");
    rbt_assert(a);
    puts("Traversing (inorder)...");
    rbt_inorder(a,func);

    for(i=0; i < N; i++)
	rbt_search(a, i);

    puts("Traversing (from max to min)...");
    it = rbt_maximum(a);
    for(i = rbt_size(a)-1; i >= 0; i--) {
	assert(n[i] == rbt_item(it));
	it = rbt_predecessor(it);
    }

    printf("rbt_size: %d\n",rbt_size(a));

    puts("Deleting all values...");
    int i = 0;
    for (i = 0; i < N; ++i) {
	printf("%d deleted\r", num[i]);
	rbt_delete(a, num[i]);
    }

    puts("\nDestroying rbt..");
    rbt_destroy(a);
    puts("OK!");
    return 0;
}
Esempio n. 3
0
RBT_NODE *rbt_predeccessor( RBT_ROOT *root , RBT_NODE *x )
{
  if ( x != &( root->nil ) ) {
    if ( x->left != &( root->nil ) ) {
      return rbt_maximum( root , x->left ) ;
    }
    else {
      RBT_NODE *y = x->p ;

      while ( y != &( root->nil ) && x == y->left ) {
        x = y ;
        y = y->p ;
      }

      return y ;
    }
  }

  return NULL ;
}