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