///// SMBinTre ////////////////////////////////

package hjelpeklasser;

import java.util.Comparator;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.stream.Stream;

public class SMBinTre<T> implements Beholder<T>
{
  private static final class Node<T>
  {
    private T verdi;               // nodens verdi
    private Node<T> venstre;       // venstre barn
    private Node<T> høyre;         // høyre barn
    private int forekomster;       // antall forekomster av verdi

    private Node(T verdi, Node<T> v, Node<T> h)
    {
      this.verdi = verdi;
      venstre = v;
      høyre = h;
      forekomster = 1;
    }

    private Node(T verdi)
    {
      this(verdi,null,null);
    }
  }

  private Node<T> rot;                       // peker til rotnoden
  private int antall;                        // antall verdier
  private final Comparator<? super T> comp;  // komparator
  private int endringer;                     // antall endringer  

  public SMBinTre(Comparator<? super T> c)    // konstruktør
  {
    rot = null;
    antall = 0;
    comp = c;
  }

  public static <T extends Comparable<? super T>> SMBinTre<T> smbintre()
  {
    return new SMBinTre<>(Comparator.naturalOrder());
  }

  public static <T> SMBinTre<T> smbintre(Comparator<? super T> c)
  {
    return new SMBinTre<>(c);
  }

  public static <T extends Comparable<? super T>> SMBinTre<T> smbintre(Stream<T> s)
  {
    SMBinTre<T> tre = smbintre();
    s.forEach(tre::leggInn);
    return tre;
  }

  public static <T> SMBinTre<T> smbintre(Stream<T> s, Comparator<? super T> c)
  {
    SMBinTre<T> tre = SMBinTre.smbintre(c);
    s.forEach(tre::leggInn);
    return tre;
  }

  @Override
  public boolean leggInn(T verdi)
  {
    // må lages spesielt for dennne klassen
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public int antall()        // antall verdier i treet
  {
    return antall;
  }

  @Override
  public boolean tom()       // er treet tomt?
  {
    return antall == 0;
  }

  @Override
  public void nullstill()
  {
    rot = null;
    antall = 0;
    endringer++;
  }

  @Override
  public boolean inneholder(T verdi)     // skal ligge i klassen SBinTre
  {
    // må lages spesielt for dennne klassen
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public boolean fjern(T verdi)
  {
    // må lages spesielt for dennne klassen
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public Iterator<T> iterator()  // returnerer en iterator
  {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public String toString()
  {
    // må lages spesielt for dennne klassen
    throw new UnsupportedOperationException("Not supported yet.");
  }

} // class SMBinTre