C++ 下面的二叉搜索树节点删除方法是如何工作的?

C++ 下面的二叉搜索树节点删除方法是如何工作的?,c++,binary-tree,C++,Binary Tree,疑问在于最终删除步骤(在final else语句中)以及如何重新分配父节点对子节点的引用。 该代码是由Mark Allen Weiss在书中的数据结构和算法分析C++编写的。 整个代码的引用: 据我对程序的理解,节点指针t指向要删除的节点。 然后将该指针复制到节点指针oldNode,然后t指向子节点(如果有)(在本例中,是findMin导致的右子节点)。 然后删除由oldNode指向的节点。 但是,如何将父节点指针(oldNode指向的父节点的parent->left或parent->right

疑问在于最终删除步骤(在final else语句中)以及如何重新分配父节点对子节点的引用。 该代码是由Mark Allen Weiss在书中的数据结构和算法分析C++编写的。 整个代码的引用:

据我对程序的理解,节点指针t指向要删除的节点。
然后将该指针复制到节点指针oldNode,然后t指向子节点(如果有)(在本例中,是findMin导致的右子节点)。
然后删除由oldNode指向的节点。
但是,如何将父节点指针(oldNode指向的父节点的parent->leftparent->right)分配给指向t指向的子节点?
它是在条件赋值t时发生的吗?

方法如下:

 void remove( const Comparable & x, BinaryNode * & t )
    {
        if( t == NULL )
            return;   // Item not found; do nothing
        if( x < t->element )
            remove( x, t->left );
        else if( t->element < x )
            remove( x, t->right );
        else if( t->left != NULL && t->right != NULL ) // Two children
        {
            t->element = findMin( t->right )->element;
            remove( t->element, t->right );
        }
        else
        {
            BinaryNode *oldNode = t;
            t = ( t->left != NULL ) ? t->left : t->right;
            delete oldNode;
        }
    }

//findMin method used in the above routine

BinaryNode * findMin( BinaryNode *t ) const
    {
        if( t == NULL )
            return NULL;
        if( t->left == NULL )
            return t;
        return findMin( t->left );
    }



 
void-remove(const-compariable&x,BinaryNode*&t)
{
如果(t==NULL)
return;//未找到项;不执行任何操作
if(xelement)
移除(x,t->左侧);
else if(t->element右侧);
否则,如果(t->left!=NULL&&t->right!=NULL)//两个子项
{
t->element=findMin(t->right)->element;
移除(t->元素,t->右侧);
}
其他的
{
BinaryNode*oldNode=t;
t=(t->left!=NULL)?t->left:t->right;
删除旧节点;
}
}
//上述例程中使用的findMin方法
BinaryNode*findMin(BinaryNode*t)常量
{
如果(t==NULL)
返回NULL;
如果(t->left==NULL)
返回t;
返回findMin(t->左);
}

remove
函数的签名中,
BinaryNode*&t
是对类型为
BinaryNode
的指针的引用。也就是说,它是对父节点的左/右节点指针的引用

我为你做了一个简单的图表,因为“一幅画抵得上千言万语”

因此,基本上,它首先将引用的实际指针(橙色箭头)保存到
oldNode
中,然后将引用变量(红点)设置为指向下一个子节点(绿色箭头)的指针,跳过
oldNode
,最后删除
oldNode


删除
函数的签名中,
BinaryNode*&t
是对类型为
BinaryNode
的指针的引用。也就是说,它是对父节点的左/右节点指针的引用

我为你做了一个简单的图表,因为“一幅画抵得上千言万语”

因此,基本上,它首先将引用的实际指针(橙色箭头)保存到
oldNode
中,然后将引用变量(红点)设置为指向下一个子节点(绿色箭头)的指针,跳过
oldNode
,最后删除
oldNode


Tip:在C++中使用 NulLPTR>代码>优先于C的无类型的代码> null < /C>。因为在C++中使用<代码> NulLPTR < /C> >优先于C的无类型的代码> NUL/<代码>。因为通过引用。谢谢你的解释,现在我可以看到发生了什么。谢谢你的解释,现在我知道发生了什么。