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; } }
// 트리 노드 삭제 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; }