Мне было интересно, может ли кто-нибудь помочь мне.Удаление узла в дереве 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» не присваивает значение новой части памяти? правильно? –
Да, эта строка копирует только ссылки (точки), а не содержимое –