C++ 在C+中为二叉搜索树生成删除函数+;
编辑*:我正在为二叉搜索树编写删除函数。我现在正在处理第一个案子。我认为这是正确的,但我想知道它是否可以递归地完成,或者更有效地完成。感谢您的帮助。假设BSTSearch搜索一个节点,C++ 在C+中为二叉搜索树生成删除函数+;,c++,performance,recursion,binary-search-tree,C++,Performance,Recursion,Binary Search Tree,编辑*:我正在为二叉搜索树编写删除函数。我现在正在处理第一个案子。我认为这是正确的,但我想知道它是否可以递归地完成,或者更有效地完成。感谢您的帮助。假设BSTSearch搜索一个节点,isLeaf如果该节点是一个叶,则返回true,并且每个节点都有一个允许其访问其父节点的指针 void BinarySearchTree::BSTDelete(int x, BSTNode *node){ BSTNode *deleteNode; deleteNode = BSTSearch(x,
isLeaf
如果该节点是一个叶,则返回true,并且每个节点都有一个允许其访问其父节点的指针
void
BinarySearchTree::BSTDelete(int x, BSTNode *node){
BSTNode *deleteNode;
deleteNode = BSTSearch(x,node);
if(isLeaf(deleteNode)){
if(deleteNode->sortkey > (deleteNode->parent)->sortkey){
delete (deleteNode->parent)->right;
(deleteNode->parent)->right = NULL;
}
else{
delete (deleteNode->parent)->left;
(deleteNode->parent)->left = NULL;
}
}
您不需要指向父对象的指针。这里是一个递归版本,应该可以工作:(如果您不知道,通过引用传递(
&
),允许您修改变量,类似于通过指针传递;BSTNode*&
是通过引用传递的指针,因此我们可以修改node->left/right(指针)的值(不仅仅是指针所指向的值))
void二进制搜索树::BSTDelete(int x,BSTNode*&node)
{
if(node==NULL)
返回;
如果(x==节点->排序键)
{
if(isLeaf(节点))
{
删除节点;
node=NULL;
}
其他的
{
//其他东西在这里
}
返回;
}
else if(xsortKey)
BSTDelete(x,节点->左侧);
其他的
BSTDelete(x,节点->右侧);
}
从树中删除可能是一项困难的操作。考虑你需要知道你正在删除的节点的父节点,这样你就可以更新当前在你感兴趣的节点上指向的子指针。然后考虑在哪里放置当前节点的(可能不止一个)的子节点,而不违反任何可能的约束约束(BST肯定是这样的)。在某些情况下,您可能需要从树的根开始重新平衡事物……“高效”是一个相对的术语,已经研究了各种二进制搜索树,每个树都有自己的优缺点。查看AVL、红黑、八字、树丛、探戈等树…这看起来不正确。您正在删除deleteNode
,然后访问它以将其父节点中的指针设置为NULL。您应该将这些行更改为deleteNode->parent->right=NULL;删除删除节点代码>。
void BinarySearchTree::BSTDelete(int x, BSTNode *&node)
{
if (node == NULL)
return;
if (x == node->sortKey)
{
if (isLeaf(node))
{
delete node;
node = NULL;
}
else
{
// other stuff goes here
}
return;
}
else if (x < node->sortKey)
BSTDelete(x, node->left);
else
BSTDelete(x, node->right);
}