You are on page 1of 7

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GenerickiTip
{
class Program
{
class Cvor<V, K>
{
K kljuc;
V vrednost;
Cvor<V, K> l;
Cvor<V, K> d;

public Cvor(V vrednost, K kljuc,


Cvor<V, K> l, Cvor<V, K> d)
{
this.vrednost = vrednost;
this.kljuc = kljuc;
this.l = l;
this.d = d;
}
public Cvor(V vrednost, K kljuc)
{
this.vrednost = vrednost;
this.kljuc = kljuc;
}
public K Kljuc
{
get { return kljuc; }
set { kljuc = value; }
}
public V Vrednost
{
get { return vrednost; }
set { vrednost = value; }
}
public Cvor<V, K> Levi
{
get { return l; }
set { l = value; }
}
public Cvor<V, K> Desni
{
get { return d; }
set { d = value; }
}
}
public enum NacinObilaska { Preorder,
Inorder, Postorder };

class BinStabloPret<V, K> where K :


IComparable<K>
{
Cvor<V, K> koren;
public BinStabloPret(V vrednost, K
kljuc)
{
koren = new Cvor<V,
K>(vrednost, kljuc);
}
public void Dodaj(V vrednost, K
kljuc)
{
Cvor<V, K> tren = koren;
while ((tren.Desni != null ||
tren.Levi != null) && tren.Kljuc.CompareTo(kljuc) !=
0)
{
if
(tren.Kljuc.CompareTo(kljuc) > 0)
tren = tren.Levi;
else
tren = tren.Desni;
}

if(tren.Kljuc.CompareTo(kljuc) != 0)
{
if
(tren.Kljuc.CompareTo(kljuc) > 0) tren.Levi = new
Cvor<V, K>(vrednost, kljuc);
else
tren.Desni = new
Cvor<V, K>(vrednost, kljuc);
}
}
public V Pretraga(K kljuc)
{
Cvor<V, K> tren = koren;
while (tren != null &&
tren.Kljuc.CompareTo(kljuc) != 0)
{
if
(tren.Kljuc.CompareTo(kljuc) > 0)
tren = tren.Levi;
else
tren = tren.Desni;
}
return tren == null ?
default(V) : tren.Vrednost;
}
#region obilasci
static void Preorder(List<V> lista,
Cvor<V, K> tren)
{
if (tren == null) return;
lista.Add(tren.Vrednost);
if (tren.Levi != null)
Preorder(lista, tren.Levi);
if (tren.Desni != null)
Preorder(lista, tren.Desni);
}
static void Inorder(List<V> lista,
Cvor<V, K> tren)
{
if (tren == null) return;
if (tren.Levi != null)
Inorder(lista, tren.Levi);
lista.Add(tren.Vrednost);
if (tren.Desni != null)
Inorder(lista, tren.Desni);
}
static void Postorder(List<V> lista,
Cvor<V, K> tren)
{
if (tren == null) return;
if (tren.Levi != null)
Postorder(lista, tren.Levi);
if (tren.Desni != null)
Postorder(lista, tren.Desni);
lista.Add(tren.Vrednost);
}
#endregion
public List<V> UListu(NacinObilaska
o)
{
List<V> lista = new List<V>();
switch(o)
{
case
NacinObilaska.Preorder:
{
Preorder(lista,
koren);
break;
}
case
NacinObilaska.Inorder:
{
Inorder(lista,
koren);
break;
}
case
NacinObilaska.Postorder:
{
Postorder(lista,
koren);
break;
}
}
return lista;
}
public List<V> SortirajListu(List<V>
lista)
{
lista.Sort();
return lista;
}
public void Obrisi(Cvor<V, K> c)
{

}
}

class Kalendar
{
BinStabloPret<IVremenskaObaveza, int>
stablo;
public Kalendar()
{

}
public void Dodaj(IVremenskaObaveza
v)
{
if(stablo == null) stablo = new
BinStabloPret<IVremenskaObaveza, int>(v,
v.Naziv.GetHashCode());
else
stablo.Dodaj(v,
v.Naziv.GetHashCode());
}
public void Obrisi(IVremenskaObaveza
v)
{

}
public List<IVremenskaObaveza>
Lista()
{
return
stablo.SortirajListu(stablo.UListu(NacinObilaska.Posto
rder));
}
public override string ToString()
{
List<IVremenskaObaveza> lista =
stablo.SortirajListu(stablo.UListu(NacinObilaska.Preor
der));
string s = "";
for (int i = 0; i <
lista.Count; i++)
{
s += $"{lista[i].Naziv}
{lista[i].Vreme} \n";
}
return s;
}
}

interface IVremenskaObaveza : IComparable


{
string Naziv { get; set; }
DateTime Vreme { get; set; }
TimeSpan Trajanje { get; set; }
bool Preklapanje(IVremenskaObaveza
v);
}

class Dogadjaj : IVremenskaObaveza


{
public string Naziv { get; set; }
public DateTime Vreme { get; set; }
public TimeSpan Trajanje { get;
set; }
public bool
Preklapanje(IVremenskaObaveza v2)
{
return
((Vreme.CompareTo(v2.Vreme) <= 0 && (Vreme +
Trajanje).CompareTo(v2.Vreme) >= 0) ||

(v2.Vreme.CompareTo(Vreme) <= 0 && (v2.Vreme +


v2.Trajanje).CompareTo(Vreme) >= 0));
}
public string Lokacija { get; set; }
public Dogadjaj(string naziv,
DateTime vreme, TimeSpan trajanje, string lokacija)
{
this.Naziv = naziv;
this.Vreme = vreme;
this.Trajanje = trajanje;
this.Lokacija = lokacija;
}
public int CompareTo(object o)
{
IVremenskaObaveza v = o as
IVremenskaObaveza;
if (Vreme.CompareTo(v.Vreme) ==
0) return 0;
if (Vreme.CompareTo(v.Vreme) >
0) return 1;
return -1;
}
}

class Zadatak : IVremenskaObaveza


{
public string Naziv { get; set; }
public DateTime Vreme { get; set; }
public TimeSpan Trajanje { get;
set; }
public bool
Preklapanje(IVremenskaObaveza v2)
{
return false;
}
public bool Uradjen { get; set; }
public string Opis { get; set; }
public Zadatak(string naziv, DateTime
vreme, string opis, bool uradjen)
{
this.Naziv = naziv;
this.Vreme = vreme;
this.Trajanje = TimeSpan.Zero;
this.Opis = opis;
this.Uradjen = uradjen;
}
public int CompareTo(object o)
{
IVremenskaObaveza v = o as
IVremenskaObaveza;
if (Vreme.CompareTo(v.Vreme) ==
0) return 0;
if (Vreme.CompareTo(v.Vreme) >
0) return 1;
return -1;
}
}

class Sastanak : IVremenskaObaveza


{
public string Naziv { get; set; }
public DateTime Vreme { get; set; }
public TimeSpan Trajanje { get;
set; }
public bool
Preklapanje(IVremenskaObaveza v2)
{
return
((Vreme.CompareTo(v2.Vreme) <= 0 && (Vreme +
Trajanje).CompareTo(v2.Vreme) >= 0) ||

(v2.Vreme.CompareTo(Vreme) <= 0 && (v2.Vreme +


v2.Trajanje).CompareTo(Vreme) >= 0));
}
public string Lokacija { get; set; }
public string[] Osobe { get; set; }
public string Agenda { get; set; }
public Sastanak(string naziv,
DateTime vreme, TimeSpan trajanje, string lokacija,
string[] osobe, string agenda)
{
this.Naziv = naziv;
this.Vreme = vreme;
this.Trajanje = trajanje;
this.Lokacija = lokacija;
this.Osobe = osobe;
this.Agenda = agenda;
}
public int CompareTo(object o)
{
IVremenskaObaveza v = o as
IVremenskaObaveza;
if (Vreme.CompareTo(v.Vreme) ==
0) return 0;
if (Vreme.CompareTo(v.Vreme) >
0) return 1;
return -1;
}
}

static void Main(string[] args)


{
Kalendar kalendar = new Kalendar();
kalendar.Dodaj(new Zadatak("Z1",
DateTime.Now, "O", true));
kalendar.Dodaj(new Dogadjaj("D2", new
DateTime(2010, 1, 1, 8, 0, 15), new TimeSpan(2, 14,
18), "Beograd"));
kalendar.Dodaj(new Sastanak("S3", new
DateTime(2010, 8, 18, 13, 30, 30), new TimeSpan(5, 12,
25), "Beograd", new string[0], "p"));
Console.WriteLine(kalendar);
Console.WriteLine("Najraniji: " +
kalendar.Lista()[0].Naziv);
Console.Read();
}
}

You might also like