【发布时间】:2018-10-22 21:28:30
【问题描述】:
我有三种方法用于删除 BST 中的节点。 RemoveRec 和 RemoveNonRec 方法递归迭代搜索节点,Remove 删除找到的节点。
private void RemoveRec(int value, ref TreeNode node)
{
if (node != null)
{
if (value < node.Value)
{
RemoveRec(value, ref node.Left);
}
else if (value > node.Value)
{
RemoveRec(value, ref node.Right);
}
else
{
Remove(value, ref node);
}
}
}
public void RemoveNonRec(int value)
{
ref TreeNode node = ref this.Root;
while (node != null)
{
if (value < node.Value)
{
node = node.Left;
}
else if (value > node.Value)
{
node = node.Right;
}
else
{
Remove(value, ref node);
break;
}
}
}
private void Remove(int value, ref TreeNode node)
{
if (node != null)
{
if (node.Counter > 1)
{
--node.Counter;
Console.WriteLine("Deleted element: {0}, elements in the node: {1}", node.Value, node.Counter);
}
else
{
int vMes = node.Value;
if (node.Left == null && node.Right == null)
{
node = null;
}
else if (node.Left != null && node.Right == null)
{
node = node.Left;
}
else if (node.Left == null && node.Right != null)
{
node = node.Right;
}
else
{
if (node.Right.Left == null)
{
node.Right.Left = node.Left;
node = node.Right;
}
else
{
TreeNode p = node.Right;
while (p.Left.Left != null)
p = p.Left;
TreeNode q = p.Left;
p.Left = q.Right;
q.Left = node.Left;
q.Right = node.Right;
node = q;
}
}
Console.WriteLine("Deleted node: {0}", vMes);
}
}
}
问题是RemoveNonRec 不能正常工作,我知道为什么。但是我不知道如何使它工作。
【问题讨论】:
标签: c# recursion iteration binary-search-tree