我想知道是否有人可以帮助我。
我想删除C#树中的节点,下面的代码完美地完成了。但我不能完全理解的是,在遍历和删除过程中声明的所有节点都只是实际节点的副本,我无法看到它们如何影响实际节点并交换它们彼此。我在C ++中使用这种方法没有问题,因为我使用指针和两个指针可以同时指向一块内存但是我们不能在C#中执行它。
class BinarySearchTree<T>
{
class Node
{
public Node Left;
public T Info;
public Node Right;
}
public bool DeleteItem(T item)
{
Node t = Root, s = null;
while (t != null && Compare(item, t.Info) != 0)
{
s = t;
t = (Compare(item, t.Info) <= 0) ? t.Left : t.Right;
}
if (t == null)
return false;
if (t.Left != null && t.Right != null) //node has 2 children
{
Node suc = t.Right, parent_suc = null;
while (suc.Left != null)
{
parent_suc = suc;
suc = suc.Left;
}
if (parent_suc == null)
t.Right = suc.Right;
else
parent_suc.Left = suc.Right;
t.Info = suc.Info;
}
else //node has either one child or no child at all
{
Node child = t.Left;
if (t.Right != null)
child = t.Right;
if (s == null)
Root = child;
else
{
if (s.Left == t)
s.Left = child;
else
s.Right = child;
}
}
return true;
}
}