Мне нужно вычислить сумму диапазона с помощью дерева сплайнов.
Я реализовал методы вставки, поиска, удаления и Splay, и они работают нормально, но у меня возникли проблемы с вычислением суммированиязаданный диапазон в дереве.
Примечание: деревья в тестовых случаях очень глубокие, и я не могу использовать рекурсивные решения.
Вот моя реализация класса дерева в C #:
public class Nodes
{
public Nodes LeftChild { get; set; }
public Nodes RightChild { get; set; }
public Nodes Parent { get; set; }
public int Key { get; set; }
public bool IsLeftChild => Parent != null && Parent.LeftChild.Key == Key;
public Nodes(int key = -1, Nodes left = null, Nodes right = null, Nodes parent = null)
{
this.LeftChild = left;
this.RightChild = right;
this.Parent = parent;
this.Key = key;
}
}
А вот мой метод суммирования:
public Nodes Summation(Nodes current, int low, int high)
{
if (current == null) return current;
if (low > high) return current;
Nodes temp;
temp = new Nodes(current);
sumData = new List<int>();
while (temp != null)
{
temp = Splay(temp, low);
if (temp.Key < low)
temp = temp.RightChild;
else
temp.LeftChild = null;
temp = Splay(temp, high);
if (temp.Key > high)
temp = temp.LeftChild;
else
temp.RightChild = null;
sumData.Add(temp.Key);
if (temp.LeftChild != null)
{
temp.LeftChild.Parent = temp.Parent;
temp = temp.LeftChild;
}
else
break;
}
return current;
}
Проблема в этом методе, мне нужно сделать копию моего исходного дерева, но я не могу сделать копию, и она всегда меняет оригиналдерево, так что дерево будет испорчено.
Буду признателен, если вы поможете исправить этот метод или поможете мне реализовать лучший.