Может кто-нибудь сказать мне, что делают следующие строки
else if ( obj < retrieve() )
{
return ( left() == 0 ) ? 0 : left()->erase( obj, left_tree );
}
else
{
return ( right() == 0 ) ? 0 : right()->erase( obj, right_tree );
}
в блоке кода ниже:
template <typename Comp>
int Binary_search_node<Comp>::erase( Comp const &obj, Binary_search_node<Comp> *&ptr_to_this)
{
if ( obj == retrieve() ) {
if ( leaf() ) { // leaf node
ptr_to_this= 0;
delete this;
}
else if ( left() != 0 && right() != 0 ) { // full node
element= right()->front();
right()->erase( retrieve(), right_tree );
}
else { // only one child
ptr_to_this= ( left() != 0 ) ? left() : right();
delete this;
}
return 1;
}
else if ( obj < retrieve() ) {
return ( left() == 0 ) ? 0 : left()->erase( obj, left_tree );}
else {
return ( right() == 0 ) ? 0 : right()->erase( obj, right_tree );}
}
Дополнительная информация:
1)
front() -- finds the minimum objects
Реализация:
template <typename Comp>
Comp Binary_search_node<Comp>::front() const
{
return( left() == 0 ) ?retrieve() :left()->front();
}
2)
left() -- returns pointer to left subtree
3)
right() -- returns pointer to right subtree
4)
*ptr_to_this points to current object (same location as what *this points to)
У меня есть представление о том, что делают строки, но я не уверен на 100%, поэтому я хотел подтвердить. Обратите внимание, что эта функция erase()
предназначена для двоичного дерева поиска. Спасибо!