Implementacja drzew lewicowych (4 pkt.) (C)
-------------------------------------------

Termin opublikowania: tydzien 28.05 -  1.06.2001
Termin oddania:       tydzien 11.06 - 15.06.2001

Zaimplementuj drzewa lewicowe (w taki sposob w jaki
byly omowione na wykladzie ASD). W tym celu zaprojektuj
strukture reprezentujaca wezel drzewa lewicowego.
Moze ona wygladac na przyklad tak:
struct wezel{
   int klucz; /* klucz po ktorym porownywane sa wezly */
/* Byc moze jakies dodatkowe dane */
   int prawa; /* dlugosc skrajnie prawej sciezki */
   struct wezel *lewy, *prawy; /* lewy i prawy syn */
   struct wezel *ojciec; 
}

Nastepnie zaprogramuj nastepujace operacje:

struct wezel *lacz( struct wezel *d1, struct wezel *d2);
void wstaw( struct wezel **d, int klucz, /*dodatkowe dane*/); 
/*dane z wezla */ najwiekszy(struct wezel **d); /* usuwa najwiekszy el */

Sam musisz zdecydowac czym beda "dodatkowe dane" i czy w ogole beda
potrzebne . Zwroc uwage na uzycie wskaznika na wskaznik w funkcjach 
wstaw i najwiekszy. Czemu ono sluzy?

Uzyj drzew lewicowych do rozwiazania nastepujacego problemu.

Uzytkownik wprowadza liczbe k.
Nastepnie powtarzamy nastepujace cykl az uzytkownik zadeklaruje chec
zakonczenia pracy:
(1) Uzytkownik wprowadza liczby (wprowadzenie zera konczy wprowadzanie
   liczb)
(2) Program wstawia liczby do drzewa lewicowego
(3) Program wypisuje k najwiekszych liczb z drzewa lewicowego usuwajac je.

Np jesli uzytkownik wpisuje kolejno:
2
6 3 7 3 0
1 9 2 3 5 0
.
.
.

to program odpowiada:
7 6
9 5
.
.
.