struct BinarySearchTree {
Node* search(Node* node, int key) {
while (nil != node && key != node->key) {
if (key < node->key) {
node = node->leftChild;
} else {
node = node->rightChild;
}
}
return node;
}
Node* minimum(Node* node) {
while (nil != node->leftChild) {
node = node->leftChild;
}
return node;
}
Node* maximum(Node* node) {
while (nil != node->rightChild) {
node = node->rightChild;
}
return node;
}
Node* predecessor(Node* node) {
if (nil != node->leftChild) {
return maximum(node->leftChild);
}
while (nil != node->parent && node == node->parent->leftChild) {
node = node->parent;
}
return node->parent;
}
Node* successor(Node* node) {
if (nil != node->rightChild) {
return minimum(node->rightChild);
}
while (nil != node->parent && node == node->parent->rightChild) {
node = node->parent;
}
return node->parent;
}
void insert(Node* node) {
Node* father = nil;
Node* current = root;
while (nil != current) {
father = current;
if (node->key < current->key) {
current = current->leftChild;
} else {
current = current->rightChild;
}
}
node->parent = father;
if (nil == father) {
root = node;
} else if (node->key < father->key) {
father->leftChild = node;
} else {
father->rightChild = node;
}
}
void transplant(Node* des, Node* src) {
if (nil == des->parent) {
root = src;
} else if (des == des->parent->leftChild) {
des->parent->leftChild = src;
} else {
des->parent->rightChild = src;
}
if (nil != src) {
src->parent = des->parent;
}
}
void del(Node* node) {
if (nil == node->leftChild) {
transplant(node, node->rightChild);
} else if (nil == node->rightChild) {
transplant(node, node->leftChild);
} else {
Node* suc = minimum(node->rightChild);
if (suc->parent != node) {
transplant(suc, suc->rightChild);
suc->rightChild = node->rightChild;
suc->rightChild->parent = suc;
}
transplant(node, suc);
suc->leftChild = node->leftChild;
suc->leftChild->parent = suc;
}
}
};