C++ 二叉搜索树查找并删除[C+;+;]
目前,我正在尝试修复使用递归进行的查找和删除函数。然而,我正在讨论的问题是,当它到达案例二的结尾时,如何确定它是导致案例零还是案例一C++ 二叉搜索树查找并删除[C+;+;],c++,binary-search-tree,C++,Binary Search Tree,目前,我正在尝试修复使用递归进行的查找和删除函数。然而,我正在讨论的问题是,当它到达案例二的结尾时,如何确定它是导致案例零还是案例一 bool findAndRemove(const Type& v) { return findAndRemove(root, nullptr, v); } bool findAndRemove(Node<Type> *fr, Node<Type> *parent, const Type& v) const
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;
}
以下是我尝试做的简短描述:
案例二(两个子)-使用右子树的最小值交换,这将导致案例零或案例一
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;
}
bool findAndRemove(常量类型&v)
{
返回find和remove(root、nullptr、v);
}
bool findAndRemove(节点*fr、节点*父节点、常量类型和v)常量
{
如果(fr==nullptr)
{
返回true;
}
if(velement)
{
返回findAndRemove(fr->left,fr,v);
}
else if(v>fr->element)
{
返回find和remove(fr->right,fr,v);
}
其他的
{
开关(GetChildren(fr))
{
案例0:
如果(父->左==fr)
{
父->左=空PTR;
删除fr;
}
其他的
{
父->右=nullptr;
删除fr;
}
打破
案例1:
如果(父->左==fr)
{
如果(fr->left!=nullptr)
{
父->左=右->左;
删除fr;
}
其他的
{
父->左=右->右;
}
}
其他的
{
如果(fr->right!=nullptr)
{
父->右=右->右;
删除fr;
}
其他的
{
父级->右=右->左;
}
}
打破
案例2:
{
节点*swap=fr->右侧;
while(交换->左!=nullptr)
{
交换=交换->左;
}
类型temp=fr->element;//30
temp=swap->element;//35
交换->元素=fr->元素;//30
fr->元件=温度;
//临时=交换->元素;
//交换->元素=温度;
//温度=fr->元件;
打破
}
}
}
返回false;
}
根据:
- 在右子树中找到一个最小值李>
- 用找到的最小值替换要删除的节点的值。现在,右子树包含一个副本李>
- 将“删除”应用到右侧子树以删除重复项
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;
}
{
//步骤1:在右子树中找到一个最小值;
节点*swap=fr->右侧;
while(交换->左!=nullptr)
{
交换=交换->左;
}
//步骤2:用找到的最小值替换要删除的节点的值。
fr->element=swap->element;
//步骤3:将remove应用于右子树以删除重复项。
//在这里,您应该在“交换”节点上调用“findAndRemove”
打破
}
“交换”没有剩余子项。如果没有正确的子项,则它有0个子项。它有一个孩子,如果它有一个正确的孩子。但你为什么要在意呢?你不能直接调用查找并删除它吗?更好的是,在其自身的功能中分离移除部分。旁注:当要求您删除root.com时,您的算法将失败。你能详细解释一下吗?@eziobah前两步已经完成了。只有第三个应该采取。第三个表示应用步骤2后的最小节点(即交换
节点)成为重复节点。因此,您可以删除此重复节点(即swap
节点)。好啊因此,只需在此节点上调用函数即可。