Заменить значения всех дублирующих элементов дерева
Скажите пожалуйста, как заменить значение всех дублирующих элементов дерева, на 0? Вот пример: Пример:
Input: 1 2 3 3 3 5 Output: 1 2 0 0 0 5
public class Node
{
public int Data;
public Node Left { get; private set; }
public Node Right { get; private set; }
public Node(int data)
{
Data = data;
Left = Right = null;
}
public void Add(int data)
{
if (data <= Data)
{
if (Left == null)
Left = new Node(data);
else
Left.Add(data);
}
else if (data >= Data)
{
if (Right == null)
Right = new Node(data);
else
Right.Add(data);
}
}
}
class Program
{
public static void Print(Node root)
{
if (root != null)
{
Print(root.Left);
Console.Write(root.Data + " ");
Print(root.Right);
}
}
public static void Main()
{
Console.WriteLine("Input size");
int val = int.Parse(Console.ReadLine());
Node root = new Node(val);
for(int i =0; i< val; i++)
{
int c = int.Parse(Console.ReadLine());
root.Add(c);
}
Print(root);
Console.ReadLine();
}
}
Ответы (1 шт):
Автор решения: VladD
→ Ссылка
Поскольку это очевидно учебное задание, код писать не буду, подскажу идею.
- Пишете процедуру обхода всех узлов дерева.
- Например, можно выдать
IEnumerable<Node>, или в стиле паттерна Visitor принимать на входAction<Node>
- Например, можно выдать
- Теперь будем применять процедуру обхода. Заведите два
HashSet<int>(изначально пустых), в первом храните текущее множество всех встреченных элементов дерева, а во втором — только те, которые являются дубликатами.- При обходе если новое значение уже есть в первом множестве, то оно дубликат, и его можно поместить и во второе множество.
- После первого обхода у вас есть множество всех дублирующихся значений, и при втором проходе можно их все обнулить.
В принципе, можно решить и за один проход, если вместо HashSet<int> завести Dictionary<int, Node>.
В задаче понадобились сложные дополнительные структуры данных. Если (случайно) по условиям задания значения в дереве отсортированы, то можно радикально упростить алгоритм.