0
我想知道是否有人可以幫助我。刪除C#樹中的節點
我想刪除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;
}
}
代碼中沒有副本,因爲Node是一個類,而不是結構。 –
@ General-Doomer所以你的意思是例如「Node suc = t.Right」不會將值賦給新的內存?對? –
是的,這行只複製鏈接(點),而不是內容 –