Tree* TreeMin(Tree* tree) { if ( tree && tree->left ) return TreeMin(tree->left); else return tree; }
static void TreeDoDelete(Tree* toDelete) { if ( toDelete->left && toDelete->right ) { Tree* minTree = TreeMin(toDelete->right); toDelete->data = minTree->data; TreeDoDelete(minTree); } else if ( toDelete->left ) { toDelete->data = toDelete->left->data; TreeDestroy(toDelete->left); } else if ( toDelete->right ) { toDelete->data = toDelete->right->data; TreeDestroy(toDelete->right); } else { if ( toDelete->parent ) { if ( toDelete->parent->left == toDelete ) toDelete->parent->left = NULL; else if ( toDelete->parent->right == toDelete ) toDelete->parent->right = NULL; } TreeDestroy(toDelete); } }
TreeNode* AVLTree::TreeSuccesor(TreeNode* x) { //если есть правое поддерево, то следующий элемент - это минимальный в поддереве if (x->right != NULL) { return TreeMin(x->right); } TreeNode* y = x->parent; //пока есть родитель и пока мы в правом поддереве родителя while ((y != NULL) && (x == y->right)) { x = y; y = y->parent; } //как только мы оказываемся в левом поддереве родителя, то возвращаем родителя return y; }
TreeNode* AVLTree::TreeMin() { return TreeMin(root); }