已编辑*:我正在处理二叉搜索树的删除功能。我现在正在处理第一个案例。我认为这是正确的,但我想知道它是否可以递归或更有效地完成。任何帮助表示赞赏。假设BSTSearch搜索节点,如果节点是叶子,则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;
}
}
答案 0 :(得分:3)
您不需要指向父级的指针。这是一个应该工作的递归版本:(通过引用传递(&
),如果你不知道,允许你修改变量,类似于通过指针传递; BSTNode *&
是一个指针通过引用传递,所以我们可以修改node-> left / right(指针)的值(不仅仅是他们指向的东西))
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);
}