static void Main() { int[] tab = { 10, 16, 12, 7, 9, 2, 21, 6, 17, 1, 15 }; Drzewo drzewoA = new Drzewo(); for (int i = 0; i < tab.Length; i++) { Węzeł w = new Węzeł(); InicjujWęzeł(w, tab[i]); WstawRekurencyjnie(drzewoA, w); } Console.WriteLine("====PRZED WSTAWIENIEM===="); Wypisuj(drzewoA.korzeń, 0); Węzeł nowy = UtwórzWęzeł(14); WstawJakoKorzeń(ref drzewoA, nowy); Console.WriteLine("====PO WSTAWIENIU===="); Wypisuj(drzewoA.korzeń, 0); Console.WriteLine(); Console.ReadLine(); }
static void Main() { int[] tab = { 10, 16, 12, 7, 9, 2, 21, 6, 17, 1, 15 }; Drzewo drzewoA = new Drzewo(); for (int i = 0; i < tab.Length; i++) { Węzeł w = new Węzeł(); InicjujWęzeł(w, tab[i]); WstawRekurencyjnie(drzewoA, w); } //ZADANIE 7 Console.WriteLine("-------- DRZEWO ---------"); Wypisuj(drzewoA.korzeń, 0); Console.WriteLine("-------- po obrocie wezla 16 w prawo ---------"); PrawaRotacja(drzewoA.korzeń.prawy); Wypisuj(drzewoA.korzeń, 0); Console.WriteLine(); Console.WriteLine("-------- po obrocie wezla w lewo ---------"); LewaRotacja(drzewoA.korzeń.prawy); Wypisuj(drzewoA.korzeń, 0); Console.WriteLine("=============="); Console.ReadKey(); }
static void Main(string[] args) { Drzewo drzewo = new Drzewo(); drzewo.korzeń = UtwórzWęzeł("F"); Węzeł wB = UtwórzWęzeł("B"); Węzeł wA = UtwórzWęzeł("A"); Węzeł wC = UtwórzWęzeł("C"); Węzeł wD = UtwórzWęzeł("D"); Węzeł wE = UtwórzWęzeł("E"); Węzeł wG = UtwórzWęzeł("G"); Węzeł wH = UtwórzWęzeł("H"); Węzeł wI = UtwórzWęzeł("I"); DodajLewy(wD, wC); DodajPrawy(wD, wE); DodajLewy(wB, wA); DodajPrawy(wB, wD); DodajLewy(wI, wH); DodajPrawy(wG, wI); DodajLewy(drzewo.korzeń, wB); DodajPrawy(drzewo.korzeń, wG); SzukajRodzica(drzewo.korzeń, "E", ""); Console.ReadKey(); }
static int Min(Drzewo d) { Węzeł tmp = d.korzeń; while (tmp.lewy != null) { tmp = tmp.lewy; } return(tmp.wartość); }
static void WstawRekurencyjnie(Drzewo drzewo, Węzeł węzeł) { if (drzewo.korzeń == null) { drzewo.korzeń = węzeł; } else { WstawRekurencyjnie(drzewo.korzeń, węzeł); } }
static void Main(string[] args) { Drzewo drzewo = new Drzewo(); Węzeł korzeń = UtwórzWęzeł(""); string nawiasowe = "(A(B(F)(D(H))(J))(C(G)(E(K))))"; //przykład z wykładu KonstruujDrzewo(drzewo, korzeń, nawiasowe); //nasz algorytm //testowo przejde drzewo tylko w lewą stronę Węzeł test = drzewo.korzeń; while (true) { Console.WriteLine(test.wartość); if (test.dzieci.Count != 0) { test = test.dzieci[0]; } else { break; } } //testowo przejde drzewo tylko w prawą stronę Console.WriteLine(); test = drzewo.korzeń; while (true) { Console.WriteLine(test.wartość); if (test.dzieci.Count != 0) { test = test.dzieci[test.dzieci.Count - 1]; } else { break; } } Console.ReadKey(); }
static int Następnik(Węzeł korzeń, Węzeł węzeł) { if (korzeń.wartość == węzeł.wartość) { Drzewo tmp = new Drzewo(); tmp.korzeń = korzeń.prawy; return(Min(tmp)); } if (korzeń.wartość > węzeł.wartość) { return(Następnik(korzeń.lewy, węzeł)); } else { return(Następnik(korzeń.prawy, węzeł)); } }
static void PrawaRotacja(Węzeł węzeł) { if (węzeł.lewy == null) { Console.WriteLine("Nie można zamienić: {0}", węzeł.wartość); return; } Drzewo poddrzewo = new Drzewo(); Węzeł podkorzeń = UtwórzWęzeł(węzeł.wartość); poddrzewo.korzeń = podkorzeń; poddrzewo.korzeń.lewy = węzeł.lewy.prawy; poddrzewo.korzeń.prawy = węzeł.prawy; węzeł.wartość = węzeł.lewy.wartość; węzeł.prawy = poddrzewo.korzeń; węzeł.lewy = węzeł.lewy.lewy; }
static void Main() { int[] tab = { 10, 16, 12, 7, 9, 2, 21, 6, 17, 1, 15 }; Drzewo drzewoA = new Drzewo(); for (int i = 0; i < tab.Length; i++) { Węzeł w = new Węzeł(); InicjujWęzeł(w, tab[i]); WstawRekurencyjnie(drzewoA, w); } Wypisuj(drzewoA.korzeń, 0); Console.WriteLine(); Console.WriteLine("======================"); Console.WriteLine("Poprzednik węzła 16: {0}", Poprzednik(drzewoA.korzeń, drzewoA.korzeń.prawy)); Console.WriteLine("Następnik węzła 16: {0}", Następnik(drzewoA.korzeń, drzewoA.korzeń.prawy)); Console.ReadKey(); }
static void Wstaw(Drzewo drzewo, Węzeł węzeł) { if (drzewo.korzeń == null) { drzewo.korzeń = węzeł; } else { Węzeł tmp = drzewo.korzeń; while (tmp != null) { if (tmp.wartość > węzeł.wartość) { if (tmp.lewy != null) { tmp = tmp.lewy; } else { tmp.lewy = węzeł; return; } } else { if (tmp.prawy != null) { tmp = tmp.prawy; } else { tmp.prawy = węzeł; return; } } } } }
static void Main(string[] args) { Osoba.Osoba[] osoby = new Osoba.Osoba[4]; for (int i = 0; i <= 3; i++) { osoby[i] = new Osoba.Osoba(); osoby[i].WprowadzOsobe(); } Console.WriteLine("Drzewo 1 - Baza"); Drzewo drzewo1 = new Drzewo(osoby); drzewo1.PrintAll(); Console.WriteLine("Drzewo 2 - kopiowanie glebokie"); Drzewo drzewo2 = drzewo1.KopiujDrzewoGleboko(); drzewo2.PrintAll(); Console.WriteLine("Drzewo 3 - kopiowanie - osoby są powiązane"); Drzewo drzewo3 = drzewo1.KopiujDrzewo(); drzewo3.PrintAll(); Console.WriteLine("Drzewo 4 - kopiowanie glebokie"); Drzewo drzewo4 = (Drzewo)drzewo1.Clone(); drzewo4.PrintAll(); if (drzewo1.ZwrocOsobe() == drzewo2.ZwrocOsobe()) { Console.WriteLine("drzewo1.ZwrocOsobe() == drzewo2.ZwrocOsobe() ===> true"); } else { Console.WriteLine("drzewo1.ZwrocOsobe() == drzewo2.ZwrocOsobe() ===> false"); } if (drzewo1.ZwrocOsobe() == drzewo3.ZwrocOsobe()) { Console.WriteLine("drzewo1.ZwrocOsobe() == drzewo3.ZwrocOsobe() ===> true"); } else { Console.WriteLine("drzewo1.ZwrocOsobe() == drzewo3.ZwrocOsobe() ===> false"); } if (drzewo1.ZwrocOsobe() == drzewo4.ZwrocOsobe()) { Console.WriteLine("drzewo1.ZwrocOsobe() == drzewo4.ZwrocOsobe() ===> true"); } else { Console.WriteLine("drzewo1.ZwrocOsobe() == drzewo4.ZwrocOsobe() ===> false"); } Console.ReadKey(); }
static void WstawJakoKorzeń(ref Drzewo drzewo, Węzeł węzeł) { List <bool> sciezka = new List <bool>(); //teoretycznie to mogłaby być tablica o rozmiarze wysokości drzewa + 1 if (drzewo.korzeń == null) { drzewo.korzeń = węzeł; } else { Węzeł tmp = drzewo.korzeń; while (tmp != null) { if (tmp.wartość > węzeł.wartość) { sciezka.Add(false); if (tmp.lewy != null) { tmp = tmp.lewy; } else { tmp.lewy = węzeł; break; } } else { sciezka.Add(true); if (tmp.prawy != null) { tmp = tmp.prawy; } else { tmp.prawy = węzeł; break; } } } } for (int i = sciezka.Count - 1; i >= 0; --i) { Węzeł rodzic = drzewo.korzeń; for (int j = 0; j < i; ++j) { if (sciezka[j] == true) { rodzic = rodzic.prawy; } else { rodzic = rodzic.lewy; } } if (sciezka[i] == false) { PrawaRotacja(rodzic); } else { LewaRotacja(rodzic); } } }
static void KonstruujDrzewo(Drzewo drzewo, Węzeł korzeń, string nawiasowe) { DołączDzieci(nawiasowe, korzeń); drzewo.korzeń = korzeń.dzieci[0]; }