有人可以告诉我以下几行吗
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()
函数用于二叉搜索树。谢谢!
答案 0 :(得分:3)
这些行只是执行搜索您要删除的项目。用英文写着:
答案 1 :(得分:0)
您的代码搜索obj
的二叉树(并假设其元素已排序),如果它以递归方式找到它,则删除它并返回1
。如果找不到,它将返回0
。
答案 2 :(得分:0)
erase
似乎是递归实现的。在每个阶段,我们测试要擦除的对象是否等于当前对象,或者我们是否需要进入左或右孩子。
如果我们想要进入的孩子不存在(left() == 0
或right() == 0
),那么我们就无法删除对象(因为它不在树中),所以我们返回{{1 }}。否则,我们将递归到子函数中,并返回它返回的任何内容。