二进制搜索树中的擦除功能

时间:2011-06-27 19:45:00

标签: c++ algorithm data-structures binary-tree

有人可以告诉我以下几行吗

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()函数用于二叉搜索树。谢谢!

3 个答案:

答案 0 :(得分:3)

这些行只是执行搜索您要删除的项目。用英文写着:

  • 如果要删除的值小于当前值,请尝试向左移动。
  • 如果要删除的值是 那么大于当前值 试着走吧。
  • 如果您尝试转到的节点不存在,则返回0.

答案 1 :(得分:0)

您的代码搜索obj的二叉树(并假设其元素已排序),如果它以递归方式找到它,则删除它并返回1。如果找不到,它将返回0

答案 2 :(得分:0)

erase似乎是递归实现的。在每个阶段,我们测试要擦除的对象是否等于当前对象,或者我们是否需要进入左或右孩子。

如果我们想要进入的孩子不存在(left() == 0right() == 0),那么我们就无法删除对象(因为它不在树中),所以我们返回{{1 }}。否则,我们将递归到子函数中,并返回它返回的任何内容。