Zadanie na laboratorium 13:

Proszę wpierw stworzyć prosty interfejs dla niezmienialnych zbiorów z parametryzowany typem przechowywanych elementów T. Taki zbiór powinien mieć metody:
  - sprawdzania, czy jakiś element jest w zbiorze;
  - wielkość, niepustość zbioru;
  - dodanie i odjęcie elementu do/ze zbioru: w tym wypadku, powinien zostać zwrócony *nowy* obiekt reprezentujący powiększony/zmniejszony zbiór, podczas gdy poprzedni obiekt powinien być nadal w pełni funkcjonalny.
Ponadto, interfejs powinien rozszerzać interfejs Iterable<T> tak, by można było tworzyć iteratory do tego zbioru.

Następnie stwórz implementację tego interfejsu dla typów T implements Comparable<T> przy pomocy drzewa BST. Metody dodawania i odejmowania powinny przebudowywać ścieżkę od korzenia do właściwego wierzchołka (dodanego, przestawionego, etc.), zaś poboczne drzewa mają pozostać nieruszone. Iterator powinien się iterować cały czas po tym samym zbiorze. Wskazówka: iterator może trzymać w sobie więcej niż tylko wierzchołek, w którym się obecnie znajduje, żeby wiedział, w jakim kontekście iterowania przez zbiór jesteśmy.