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; } } };