Exemple #1
0
void BST::drop(int key) {
  if(empty())
    return;

  Node *keyNode = findParent(key);

  if(keyNode->key() == key) {
    Node *successor = findSuccessor(keyNode);

    if(successor == NULL) { // No right subtree.
      if(root != keyNode) {
        if(keyNode->parent->left == keyNode)
          keyNode->parent->left = keyNode->left;
        else
          keyNode->parent->right = keyNode->left;
      }
      else root = keyNode->left;
    }
    else replaceWithSuccessor(keyNode, successor);
    
    keyNode->parent = NULL;
    keyNode->left   = NULL;
    keyNode->right  = NULL;
    delete keyNode;
  }
}
int deleteItem(struct treeNode * node, int item)
{
    struct treeNode *parent=0,*del=0;
    int type;
    if (node==0) return 0;
    if (root->item==item && root==node){
      parent=0;
      del=root;
    }
    if (node->left!=0 && node->left->item==item ){
        parent=node;
        del=node->left;
        type=0;
    }
    if (node->right!=0 && node->right->item==item){
        parent=node;
        del=node->right;
        type=1;
    }
    if (parent==0 && del==0){
        int t=deleteItem(node->left,item);
        if(t==FALSE_VALUE)t=deleteItem(node->right,item);
        return t;
    }
    else {
        if (del->left==0 && del->right==0){
            free(del);
            if(parent==0) initializeTree();
            else if(type==0) parent->left=0;
            else parent->right=0;
        }
        else if (del->left==0){
            if (parent==0) root=del->right;
            else if (type==0) parent->left=del->right;
            else parent->right=del->right;
            free(del);
        }
        else if (del->right==0){
            if (parent==0) root=del->left;
            else if (type==0) parent->left=del->left;
            else parent->right=del->left;
            free(del);
        }
        else{
            struct treeNode *scc;
            scc=findSuccessor(del,del->item);
            int x;
            x=del->item;
            del->item=scc->item;
            scc->item=x;
            deleteItem(root,scc->item);
        }
        return TRUE_VALUE;
    }

}
/* Performs a find successor request to a random id */
void Node::randomLookup()
{
  int res          = id_;
  int random_index = RngStream_RandInt(stream, 0, nb_bits - 1);
  int random_id    = fingers_[random_index];
  XBT_DEBUG("Making a lookup request for id %d", random_id);
  if (random_id != id_)
    res = findSuccessor(random_id);
  XBT_DEBUG("The successor of node %d is %d", random_id, res);
}
/** refreshes the finger table of the current node (called periodically) */
void Node::fixFingers()
{
  XBT_DEBUG("Fixing fingers");
  int id = findSuccessor(id_ + (1U << next_finger_to_fix));
  if (id != -1) {
    if (id != fingers_[next_finger_to_fix]) {
      setFinger(next_finger_to_fix, id);
      printFingerTable();
    }
    next_finger_to_fix = (next_finger_to_fix + 1) % nb_bits;
  }
}
Exemple #5
0
// 트리 노드 삭제 
void deleteNode(Tree *RBT, Node *node)
{
	Node *successor, *fixupNode;
	Node *left = node->left;
	Node *right = node->right;
	Node *p = node->parent;
	int nColor = node->color;

	// child 0, 1 : 왼쪽노드 없는 경우
	if (left == RBT->NIL)
	{
		fixupNode = right;
		transPlant(RBT, node, right);
	}
	// child 1 : 오른쪽노드 없는 경우
	else if (right == RBT->NIL)
	{
		fixupNode = left;
		transPlant(RBT, node, left);
	}
	// child 2 : 자식노드 2개인 경우 -> successor를 삭제하는 것으로 가정
	else
	{
		successor = findSuccessor(RBT, right);
		nColor = successor->color;

		fixupNode = successor->right;

		// fixupNode를 successor의 자리에 이식
		transPlant(RBT, successor, fixupNode);
		successor->right = node->right;
		successor->right->parent = successor;

		// successor를 node의 자리에 이식
		transPlant(RBT, node, successor);
		successor->left = node->left;
		successor->left->parent = successor;

		successor->color = node->color;
	}

	// 삭제 노드의 색이 BLACK인 경우 Violation 발생
	if (nColor == BLACK)
	{
		treeDelFixUp(RBT, fixupNode);
	}

	// 메모리 영역 해방시켜줌
	free(node);

	return;
}