Заменить значения всех дублирующих элементов дерева

Скажите пожалуйста, как заменить значение всех дублирующих элементов дерева, на 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

Поскольку это очевидно учебное задание, код писать не буду, подскажу идею.

  1. Пишете процедуру обхода всех узлов дерева.
    • Например, можно выдать IEnumerable<Node>, или в стиле паттерна Visitor принимать на вход Action<Node>
  2. Теперь будем применять процедуру обхода. Заведите два HashSet<int> (изначально пустых), в первом храните текущее множество всех встреченных элементов дерева, а во втором — только те, которые являются дубликатами.
    • При обходе если новое значение уже есть в первом множестве, то оно дубликат, и его можно поместить и во второе множество.
  3. После первого обхода у вас есть множество всех дублирующихся значений, и при втором проходе можно их все обнулить.

В принципе, можно решить и за один проход, если вместо HashSet<int> завести Dictionary<int, Node>.


В задаче понадобились сложные дополнительные структуры данных. Если (случайно) по условиям задания значения в дереве отсортированы, то можно радикально упростить алгоритм.

→ Ссылка