[英]Binary Search Tree Find And Remove [C++]
目前,我目前正在嘗試修復我正在使用遞歸執行的查找和刪除功能。 但是,我遇到的問題是何時到達案例二的結尾,如何確定它是導致案例零還是案例一。
這是我嘗試做的事情的簡短描述:案例二(兩個孩子) - 與右子樹的最小值交換,這導致案例零或案例一。
bool findAndRemove(const Type& v)
{
return findAndRemove(root, nullptr, v);
}
bool findAndRemove(Node<Type> *fr, Node<Type> *parent, const Type& v) const
{
if (fr == nullptr)
{
return true;
}
if (v < fr->element)
{
return findAndRemove(fr->left, fr, v);
}
else if (v > fr->element)
{
return findAndRemove(fr->right, fr, v);
}
else
{
switch (GetChildren(fr))
{
case 0:
if (parent->left == fr)
{
parent->left = nullptr;
delete fr;
}
else
{
parent->right = nullptr;
delete fr;
}
break;
case 1:
if (parent->left == fr)
{
if (fr->left != nullptr)
{
parent->left = fr->left;
delete fr;
}
else
{
parent->left = fr->right;
}
}
else
{
if (fr->right != nullptr)
{
parent->right = fr->right;
delete fr;
}
else
{
parent->right = fr->left;
}
}
break;
case 2:
{
Node<Type> * swap = fr->right;
while (swap->left != nullptr)
{
swap = swap->left;
}
Type temp = fr->element; // 30
temp = swap->element; // 35
swap->element = fr->element; // 30
fr->element = temp;
//temp = swap->element;
//swap->element = temp;
//temp = fr->element;
break;
}
}
}
return false;
}
根據算法:
- 在右子樹中找到最小值;
- 用找到的最小值替換要刪除的節點的值。 現在,右子樹包含一個副本!
- 將 remove 應用於右子樹以刪除重復項。
在您的代碼中, swap
指向該右子樹中的最小節點,因此如果您在該節點上調用findAndRemove
函數,則可以簡單地將其刪除。
{
// STEP 1: find a minimum value in the right subtree;
Node<Type> * swap = fr->right;
while (swap->left != nullptr)
{
swap = swap->left;
}
// STEP 2: replace value of the node to be removed with found minimum.
fr->element = swap->element;
// STEP 3: apply remove to the right subtree to remove a duplicate.
// Here you should call 'findAndRemove' on 'swap' node
break;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.