Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 38.86 KB | None | 0 0
  1. //BSF
  2. Queue<int> kolejka = new Queue<int>(); //kolejka
  3. List<int> wyniki = new List<int>();
  4. kolejka.Enqueue(start); //dodanie pierwszego
  5. bool[] odwiedzone = new bool[tab.GetLength(0)];
  6. while (kolejka.Count != 0)
  7. {
  8. int pobrany = kolejka.Dequeue();
  9. if (odwiedzone[pobrany] == false)
  10. {
  11. odwiedzone[pobrany] = true;
  12. for (int i = 0; i<tab.GetLength(1); i++)
  13. {
  14. if (tab[pobrany, i] != 0)
  15. {
  16. kolejka.Enqueue(i);
  17. }
  18. }
  19. wyniki.Add(pobrany);
  20. }
  21. }
  22. }
  23.  
  24.  
  25. //BSF
  26. Queue<int> kolejka = new Queue<int>(); //kolejka
  27. List<int> wyniki = new List<int>();
  28. kolejka.Enqueue(start); //dodanie pierwszego
  29. bool[] odwiedzone = new bool[G.Count];
  30. while (kolejka.Count != 0)
  31. {
  32. int pobrany = kolejka.Dequeue();
  33. if (odwiedzone[pobrany - 1] == false)
  34. {
  35. odwiedzone[pobrany - 1] = true;
  36. for (int i = 0; i<G[pobrany - 1].Count ; i++)
  37. kolejka.Enqueue(G[pobrany - 1][i]);
  38. wyniki.Add(pobrany);
  39. }
  40. }
  41.  
  42. //Inicjacja dijkstry
  43. L := {s}; R := V-{s};
  44. w[s] := 0;
  45. dla każdego v R wykonaj
  46. jeżeli(v, s) E to
  47. w[v] := w((v, s))
  48. w przeciwnym przypadku
  49. w[v] := ∞;
  50. //właściwe obliczenia
  51. dla i := 1 aż do n-1 wykonaj
  52. początek bloku
  53. u := wierzchołek z R o minimalnej wadze w[u];
  54. R := R - {u};
  55. L := L + {u};
  56. dla każdego v N(u) ∩ R wykonaj
  57. jeżeli w[u] + w((u, v)) < w[v] to
  58. w[v] := w[u] + w((u, v));
  59. koniec bloku
  60. //dla każdego v V, w[v] = w*(v)
  61.  
  62.  
  63. //Inicjacja - macierz sasiedztwa dijkstry
  64. dla i := 1 aż do n wykonaj
  65. w[vi := A[i, s];
  66. r[i] := 1;
  67. r[s] := 0;
  68. //właściwe obliczenia
  69. dla i := 1 aż do n-1 wykonaj
  70. początek bloku
  71. u := MinR;
  72. r[u]:=0;
  73. dla i := 1 aż do n wykonaj
  74. jeżeli r[i] = 1 to
  75. jeżeli w[u]+A[u, i] <w[i] to
  76. w[i] := w[u] + A[u, i];
  77. koniec bloku
  78. //dla każdego v V, w[v] = w*(v)
  79.  
  80. //wstawianie do drzewa bst
  81. static void Wstaw(Drzewo drzewo, Węzeł węzeł)
  82. {
  83. if (drzewo.korzeń == null) drzewo.korzeń = węzeł;
  84. else
  85. {
  86. Węzeł tmp = drzewo.korzeń;
  87. while (tmp != null)
  88. {
  89. if (tmp.wartość > węzeł.wartość)
  90. {
  91. if (tmp.lewy != null) tmp = tmp.lewy;
  92. else
  93. {
  94. tmp.lewy = węzeł; return;
  95. }
  96. }
  97. else
  98. {
  99. if (tmp.prawy != null) tmp = tmp.prawy;
  100. else
  101. {
  102. tmp.prawy = węzeł; return;
  103. }
  104. }
  105. }
  106. }
  107. }
  108.  
  109. static Węzeł WyszukajRekurencyjnie(Węzeł korzeń, int wartość)
  110. {
  111. if (korzeń == null) return null;
  112. if (korzeń.wartość == wartość) return korzeń;
  113. if (korzeń.wartość > wartość) return WyszukajRekurencyjnie(korzeń.lewy, wartość);
  114. else return WyszukajRekurencyjnie(korzeń.prawy, wartość);
  115. }
  116.  
  117. static void UsuńIteracyjnieL(Drzewo drzewo, int wartość)
  118. {
  119. if (drzewo.korzeń == null) return;
  120. Węzeł tmp = drzewo.korzeń;
  121. Węzeł rodzic = null;
  122. while (tmp != null)
  123. {
  124. if (tmp.wartość == wartość)
  125. {
  126. // tylko jedno dziecko albo wcale
  127. if (tmp.lewy == null)
  128. {
  129. if (rodzic == null) // usuwamy korzeń
  130. {
  131. drzewo.korzeń = tmp.prawy;
  132. }
  133. else
  134. {
  135. if (rodzic.lewy == tmp) rodzic.lewy = tmp.prawy;
  136. else rodzic.prawy = tmp.prawy;
  137. }
  138. }
  139. else if (tmp.prawy == null)
  140. {
  141. if (rodzic == null) // usuwamy korzeń
  142. {
  143. drzewo.korzeń = tmp.lewy;
  144. }
  145. else
  146. {
  147. if (rodzic.lewy == tmp) rodzic.lewy = tmp.lewy;
  148. else rodzic.prawy = tmp.lewy;
  149. }
  150. }
  151. else if (tmp.lewy != null && tmp.prawy != null)
  152. {// krok w lewo
  153. Węzeł qRodzic = tmp;
  154. Węzeł q = tmp.lewy;
  155. while (q.prawy != null) // teraz do oporu w prawo
  156. { qRodzic = q; q = q.prawy; }
  157. // usuwamy q z jego miejsca a na jego miejsce
  158. // wstawiamy lewego potomka (moze byc null)
  159. if (qRodzic.prawy == q) qRodzic.prawy = q.lewy;
  160. else qRodzic.lewy = q.lewy;
  161. // teraz q przenosimy na miejsce tmp
  162. if (rodzic == null) // usuwamy korzeń
  163. { drzewo.korzeń = q; }
  164. else
  165. {
  166. if (rodzic.lewy == tmp) rodzic.lewy = q;
  167. else rodzic.prawy = q;
  168. }
  169. // na koniec wstawiamy potomkow tmp jako potomkow q
  170. q.lewy = tmp.lewy;
  171. q.prawy = tmp.prawy;
  172. }
  173. return;
  174. }
  175. rodzic = tmp; // szukamy dalej
  176. if (tmp.wartość > wartość) tmp = tmp.lewy;
  177. else tmp = tmp.prawy;
  178. }
  179. return; // nie znaleziono
  180. }
  181.  
  182.  
  183. WywazDrzewo(Węzeł węzeł)
  184. Jeżeli węzeł == null lub węzeł.waga == 1 to
  185. zakończ;
  186. Podzial(węzeł, węzeł.waga / 2);
  187. WywazDrzewo(węzeł.lewy);
  188. WywazDrzewo(węzeł.prawy);
  189. ObliczWagi(Węzeł węzeł)
  190. Jeżeli węzeł != null to
  191. Jeżeli węzeł.prawy == null oraz węzeł.lewy == null to
  192. węzeł.waga = 1;
  193. w przeciwnym przypadku
  194. węzeł.waga = ObliczWagi(węzeł.lewy)+ ObliczWagi(węzeł.prawy)+ 1;
  195. zwróć węzeł.waga;
  196. w przeciwnym przypadku zwróć 0;
  197.  
  198. class Węzeł
  199. {
  200. Dane wartość; // tutaj klucz
  201. int waga;
  202. Węzeł lewy;
  203. Węzeł prawy;
  204. }
  205.  
  206. Podzial(Węzeł węzeł, int liczba)
  207. Jeżeli węzeł.lewy == null to wl = 0;
  208. w przeciwnym przypadku
  209. wl = węzeł.lewy.waga;
  210. Jeżeli wl > Liczba to
  211. Podzial(węzeł.lewy, liczba);
  212. ObrotPrawo(węzeł);
  213. ObliczWagi(węzeł);
  214. w przeciwnym przypadku
  215. Jeżeli wl<Liczba to
  216. Podzial(wezeł.prawy, liczba-wl-1);
  217. ObrotLewo(węzeł);
  218. ObliczWagi(węzeł);
  219. // wl == liczba jest OK
  220.  
  221. Naprawianie kopca – pseudokod(rekurencja)
  222. Napraw(w) // w indeks korzenia naprawianego poddrzewa
  223. n = liczba elementów w całym kopcu
  224. lewy = 2 * w + 1 // indeks lewego dziecka
  225. prawy = 2 * w +2 // indeks prawego dziecka
  226. if (lewy<n) // jeżeli są dzieci, chociażby tylko lewe
  227. największy = w
  228. if(kopiec[lewy]>kopiec[największy])
  229. największy = lewy//Jeżeli lewe dziecko ma wartość większą
  230. if(prawy<n && kopiec[prawy]> kopiec[największy])
  231. największy = prawy//Jeżeli prawe dziecko ma wartość większą
  232. if (największy != w)
  233. // zamień korzeń z większym dzieckiem
  234. tmp=kopiec[w]
  235. kopiec[w] = kopiec[największy]
  236. kopiec[największy]=tmp
  237. Napraw(największy) // rekurencja
  238.  
  239.  
  240. Naprawianie kopca – pseudokod(iteracja)
  241. Napraw(w) // w indeks korzenia naprawianego poddrzewa
  242. n = liczba elementów w całym kopcu
  243. while (2* w+1< n) // dopóki są dzieci, chociażby tylko lewe
  244. lewy = 2 * w +1 // indeks lewego dziecka
  245. prawy = 2 * w +2 // indeks prawego dziecka
  246. największy = w
  247. if(kopiec[lewy]>kopiec[największy])
  248. największy = lewy//Jeżeli lewe dziecko ma wartość większą
  249. if(prawy<n && kopiec[prawy]> kopiec[największy])
  250. największy = prawy//Jeżeli prawe dziecko ma wartość większą
  251. if (największy != w)
  252. tmp=kopiec[w] // zamień korzeń z większym dzieckiem
  253. kopiec[w] = kopiec[największy]
  254. kopiec[największy]=tmp
  255. w = największy
  256. else
  257. break // zakończ pętlę
  258.  
  259. Naprawianie kopca – rekurencja(C#)
  260. static void Napraw(int[] kopiec, int węzeł)
  261. {
  262. int wielkość = kopiec.Length;
  263. int największy = węzeł; // korzeń drzewa
  264. int lewe = 2 * węzeł + 1;
  265. int prawe = 2 * węzeł + 2;
  266. // dopóki są dzieci
  267. if (lewe < wielkość && kopiec[lewe] > kopiec[największy])
  268. {
  269. największy = lewe;
  270. }
  271. if (prawe < wielkość && kopiec[prawe] > kopiec[największy])
  272. {
  273. największy = prawe;
  274. }
  275. if (największy != węzeł) // zamiana
  276. {
  277. int pomoc = kopiec[węzeł];
  278. kopiec[węzeł] = kopiec[największy];
  279. kopiec[największy] = pomoc;
  280. Napraw(kopiec, największy);
  281. }
  282. }
  283.  
  284. Naprawianie kopca – iteracja(C#)
  285. static void Napraw(int[] kopiec, int węzeł)
  286. {
  287. int wielkość = kopiec.Length;
  288. int największy = węzeł; // korzeń drzewa lub poddrzewa
  289. while (węzeł <= (wielkość - 1) / 2) // dopóki są dzieci
  290. {
  291. int lewe = 2 * węzeł + 1;
  292. int prawe = 2 * węzeł + 2;
  293. if (lewe < wielkość && kopiec[lewe] > kopiec[największy])
  294. {
  295. największy = lewe;
  296. }
  297. if (prawe < wielkość && kopiec[prawe] > kopiec[największy])
  298. {
  299. największy = prawe;
  300. }
  301. if (największy != węzeł)
  302. {
  303. int pomoc = kopiec[węzeł];
  304. kopiec[węzeł] = kopiec[największy];
  305. kopiec[największy] = pomoc;
  306. węzeł = największy; // w następnej iteracji
  307. }
  308. else break;// nie bylo potrzeby naprawiać
  309. }
  310. }
  311.  
  312. static void Buduj(int[] kopiec)
  313. {
  314. int wielkość = kopiec.Length;
  315. for (int i = (wielkość / 2 - 1); i >= 0; i--)
  316. Napraw(kopiec, i);
  317. }
  318.  
  319.  
  320. Sortowanie przez kopcowanie(C#)
  321. static void Napraw(int[] kopiec, int węzeł, int wielkość)
  322. {
  323. int największy = węzeł; // korzeń drzewa
  324. int lewe = 2 * węzeł + 1;
  325. int prawe = 2 * węzeł + 2;
  326. // dopóki są dzieci
  327. if (lewe < wielkość && kopiec[lewe] > kopiec[największy])
  328. {
  329. największy = lewe;
  330. }
  331. if (prawe < wielkość && kopiec[prawe] > kopiec[największy])
  332. {
  333. największy = prawe;
  334. }
  335. if (największy != węzeł)
  336. {
  337. int pomoc = kopiec[węzeł];
  338. kopiec[węzeł] = kopiec[największy];
  339. kopiec[największy] = pomoc;
  340. Napraw(kopiec, największy, wielkość);
  341. }
  342. }
  343. Algorytmy i Struktury Danych 22
  344. static void Sortuj(int[] dane)
  345. {
  346. Buduj(dane);
  347. int wielkość = dane.Length;
  348. while (wielkość > 1)
  349. {
  350. // zamieniamy największy element z ostatnim
  351. int największy = dane[0];
  352. dane[0] = dane[wielkość - 1];
  353. dane[wielkość - 1] = największy;
  354. // naprawiamy zmniejszony kopiec
  355. wielkość = wielkość - 1;
  356. Napraw(dane, 0, wielkość);
  357. }
  358. }
  359. static void Buduj(int[] kopiec)
  360. {
  361. int wielkość = kopiec.Length;
  362. for (int i = (wielkość / 2 - 1); i >= 0; i--)
  363. Napraw(kopiec, i, kopiec.Length);
  364. }
  365. Dodajemy parametr wielkość w metodzie Napraw,
  366. aby pracować tylko z tą częścią tablicy, która
  367. tworzy kopiec(wówczas musimy uwzględnić to w
  368. metodzie buduj)
  369.  
  370. //drzewo
  371. // pre-order
  372. static void Wypisuj(Węzeł węzeł)
  373. {
  374. Console.Write("(" + węzeł.wartość);
  375. if (węzeł.dzieci.Count > 0)
  376. {
  377. for (int i = 0; i < węzeł.dzieci.Count; i++)
  378. {
  379. Wypisuj((Węzeł)węzeł.dzieci[i]);
  380. }
  381. }
  382. Console.Write(")");
  383. }
  384.  
  385. // post-order
  386. static void WypisujPost(Węzeł węzeł)
  387. {
  388. // najpierw wypisujemy potomków
  389. if (węzeł.dzieci.Count > 0)
  390. {
  391. for (int i = 0; i < węzeł.dzieci.Count; i++)
  392. {
  393. WypisujPost((Węzeł)węzeł.dzieci[i]);
  394. }
  395. }
  396. // potem rodzica
  397. Console.Write(" " + węzeł.wartość);
  398. }
  399. static int Wysokość(Węzeł węzeł)
  400. {
  401. int wysokość = 0;
  402. for (int i = 0; i < węzeł.dzieci.Count; i++)
  403. {
  404. Węzeł następnik = (Węzeł)węzeł.dzieci[i];
  405. wysokość = Math.Max(wysokość, Wysokość(następnik) + 1);
  406. }
  407. return wysokość;
  408. }// zwraca wynik
  409.  
  410. Reprezentacja dowiązaniowa drzewa - uwagi
  411.  Reprezentacja dowiązaniowa jest przydatna gdy
  412. chcemy do krawędzi przyporządkować wagi, wówczas
  413. wygodnie jest dodać dodatkową klasę Krawędź.
  414. 17 Algorytmy i Struktury Danych
  415. class Krawędź
  416. {
  417. public Węzeł węzeł;
  418. public int waga;
  419. public Krawędź(Węzeł węzeł, int waga)
  420. {
  421. this.węzeł = węzeł;
  422. this.waga = waga;
  423. }
  424. }
  425. class Drzewo
  426. {
  427. public Węzeł korzeń;
  428. }
  429. class Węzeł
  430. {
  431. public String wartość;
  432. public List<Krawędź> dzieci;
  433. public Węzeł(String wartość)
  434. {
  435. this.wartość = wartość;
  436. dzieci = new List<Krawędź>();
  437. }
  438. }
  439.  
  440. Uwagi o implementacji obiektowej
  441.  Implementacja obiektowa z jednej strony jest wygodna
  442. ale z drugiej strony wymaga jednoznacznej identyfikacji
  443. węzłów.
  444. 18 Algorytmy i Struktury Danych
  445. class Drzewo<T> where T : IEquatable<T>
  446. {
  447. // klasa pomocnicza Węzeł
  448. class Węzeł
  449. {
  450. public T wartość;
  451. public List<Węzeł> dzieci;
  452. public Węzeł(T wartość)
  453. {
  454. this.wartość = wartość;
  455. this.dzieci = new List<Węzeł>();
  456. }
  457. }
  458. Węzeł korzeń;
  459. // metody
  460. }
  461. public bool DodajKorzeń(T korzeń)
  462. {
  463. if (this.korzeń == null)
  464. {
  465. this.korzeń = new Węzeł(korzeń);
  466. return true;
  467. }
  468. return false; // korzeń już jest
  469. }
  470.  
  471. Uwagi o implementacji obiektowej(2)
  472.  Identyfikacji węzłów mogłaby dokonywać pomocnicza
  473. prywatna metoda Znajdź.Zakładamy, że węzeł jest
  474. jednoznacznie określony przez przechowywaną wartość
  475. (a typ T jest Equatable)
  476. 19 Algorytmy i Struktury Danych
  477. Węzeł Znajdź(Węzeł węzeł, T wartość)
  478. {
  479. if (węzeł.wartość.Equals(wartość)) return węzeł;
  480. if (węzeł.dzieci.Count > 0)
  481. {
  482. for (int i = 0; i < węzeł.dzieci.Count; i++)
  483. {
  484. Węzeł szukany = Znajdź(węzeł.dzieci[i], wartość);
  485. if (szukany != null) return szukany;
  486. }
  487. }
  488. return null;
  489. }
  490.  
  491. Uwagi o implementacji obiektowej(3)
  492.  Wówczas nowy element dodaje się do znalezionego
  493. węzła przechowującego podaną wartość.Poniższa
  494. metoda aż dwa razy wywołuje Znajdź.Taka metoda jest
  495. kosztowna.
  496. 20 Algorytmy i Struktury Danych
  497. public bool Dodaj(T rodzic, T dziecko)
  498. {
  499. if (korzeń == null) return false;
  500. Węzeł parent = Znajdź(korzeń, rodzic);
  501. if (parent == null) // nie ma takiego węzła nie ma gdzie doczepić dziecka
  502. return false;
  503. if (Znajdź(korzeń, dziecko) != null) // takie dziecko juz jest
  504. return false;
  505. parent.dzieci.Add(new Węzeł(dziecko));
  506. return true;
  507. }
  508.  
  509. Uwagi o implementacji obiektowej(4)
  510.  Wypisywanie i inne operacje są raczej proste.
  511. 21 Algorytmy i Struktury Danych
  512. public void WypiszPre()
  513. {
  514. if (korzeń == null)
  515. {
  516. Console.WriteLine("drzewo jest puste");
  517. }
  518. WypisujPre(korzeń);
  519. }
  520. void WypisujPre(Węzeł węzeł)
  521. {
  522. Console.Write(węzeł.wartość + " ");
  523. if (węzeł.dzieci.Count > 0)
  524. {
  525. for (int i = 0; i < węzeł.dzieci.Count; i++)
  526. WypisujPre((Węzeł)węzeł.dzieci[i]);
  527. }
  528. }
  529.  
  530. Reprezentacja „rodzicielska” drzewa z korzeniem
  531. na tablicy
  532.  Przykładowe kody w C#.
  533. class Drzewo
  534. {
  535. const int n = 100;
  536. int[] rodzice = new int[n];
  537. string[] etykiety = new string[n];
  538. int m = 0;
  539. public Drzewo(string korzeń)
  540. {
  541. rodzice[0] = -1;
  542. etykiety[0] = korzeń;
  543. m = 1;
  544. }
  545. public int Dodaj(string etykieta, int rodzic)
  546. {
  547. rodzice[m] = rodzic;
  548. etykiety[m] = etykieta;
  549. return m++;
  550. }
  551. //…
  552. }
  553. Reprezentacja „rodzicielska”
  554. wypisywanie pre-order i post-order
  555. Algorytmy i Struktury Danych 24
  556. public void WypiszPre() // pre-order
  557. {
  558. WypisujPre(0);
  559. Console.WriteLine();
  560. }
  561. public void WypisujPre(int k)
  562. {
  563. Console.Write("(" + etykiety[k]);
  564. for (int i = 0; i < m; i++)
  565. if (rodzice[i] == k) WypisujPre(i);
  566. }
  567. public void WypiszPost() // post-order
  568. {
  569. WypisujPost(0);
  570. Console.WriteLine();
  571. }
  572. public void WypisujPost(int k)
  573. {
  574. for (int i = 0; i < m; i++)
  575. if (rodzice[i] == k) WypisujPost(i);
  576. Console.Write(" " + etykiety[k]);
  577. }
  578.  
  579.  
  580. Wypisywanie drzewa binarnego
  581. Algorytmy i Struktury Danych 33
  582. // in-order
  583. static void WypisujIn(Węzeł węzeł)
  584. {
  585. if (węzeł == null) return;
  586. WypisujIn((Węzeł)węzeł.lewy);
  587. Console.Write(węzeł.wartość + " ");
  588. WypisujIn((Węzeł)węzeł.prawy);
  589. }
  590. static int Wysokość(Węzeł węzeł)
  591. {
  592. int wysokość = 0;
  593. if (węzeł == null) return 0;
  594. if (węzeł.lewy != null)
  595. wysokość = Math.Max(wysokość, Wysokość(węzeł.lewy) + 1);
  596. if (węzeł.prawy != null)
  597. wysokość = Math.Max(wysokość, Wysokość(węzeł.prawy) + 1);
  598. return wysokość;
  599. }// Zwraca wynik
  600. // pre-order
  601. static void WypisujPre(Węzeł węzeł)
  602. {
  603. if (węzeł == null) return;
  604. Console.Write(węzeł.wartość + " ");
  605. WypisujPre((Węzeł)węzeł.lewy);
  606. WypisujPre((Węzeł)węzeł.prawy);
  607. }
  608. // post-order
  609. static void WypisujPost(Węzeł węzeł)
  610. {
  611. if (węzeł == null) return;
  612. WypisujPost((Węzeł)węzeł.lewy);
  613. WypisujPost((Węzeł)węzeł.prawy);
  614. Console.Write(węzeł.wartość + " ");
  615. }
  616.  
  617.  
  618. static public Lista Dodaj(Lista l, int liczba) //Do głowy
  619. {
  620. Lista tmp = new Lista(); // nowy węzeł
  621. tmp.dane = liczba;
  622. tmp.następny = l; //dotychczasowa głowa staje się "następny"
  623. return tmp; // dodany element staje się głową
  624. }
  625.  
  626.  
  627.  Sprawdzanie czy lista jest pusta i obliczanie ile elementów zawiera.
  628. static public bool CzyPusta(Lista l)
  629. {
  630. return l == null;
  631. }
  632. // obliczamy rozmiar przechodząc przez wszystkie elementy listy
  633. static public int PodajRozmiar(Lista l) // aż dojedziemy do nulla
  634. {
  635. int licznik = 0;
  636. for (Lista tmp = l; tmp != null; tmp = tmp.następny)
  637. licznik++;
  638. return licznik;
  639. }
  640.  Usuwanie elementu najłatwiejsze jest od początku listy.
  641. static public Lista Usuń(Lista l) //Z głowy
  642. {
  643. if (l != null) // sprawdzamy, czy lista nie jest pusta
  644. return l.następny;
  645. else return l;
  646. }
  647.  
  648.  
  649.  Odczytywanie wartości i-tego elementu(błąd gdy i-ty element nie istnieje).
  650. static public int Podaj(Lista l, int i) //i-ty element
  651. {
  652. int licznik = 0;
  653. for (Lista tmp = l; tmp != null; tmp = tmp.następny)
  654. if (licznik++ == i) return tmp.dane;
  655. throw new Exception("indeks poza zakresem!");
  656. }
  657.  Sprawdzanie czy lista zawiera szukaną wartość(zwracamy indeks elementu
  658. albo -1 gdy nie znaleziono).
  659. static public int CzyZawiera(Lista l, int n) //element o wartości n
  660. {
  661. int licznik = 0;
  662. for (Lista tmp = l; tmp != null; tmp = tmp.następny, licznik++)
  663. if (tmp.dane == n) return licznik;
  664. return -1;
  665. }
  666.  
  667. static public Lista Dodaj(Lista L, int n, int i)
  668. {
  669. if (i == 0) return Dodaj(L, n); // jak i zero to na początek
  670. int licznik = 0;
  671. for (Lista tmp = L; tmp != null; tmp = tmp.następny, licznik++)
  672. if (licznik == i - 1)
  673. {
  674. Lista l = new Lista();
  675. l.dane = n;
  676. l.następny = tmp.następny;
  677. tmp.następny = l;
  678. return L;
  679. }
  680. throw new Exception("indeks poza zakresem!");
  681. }
  682.  
  683.  
  684. static public Lista Usuń(Lista L, int i) //usuwa element na i-tej pozycji
  685. {
  686. if (i == 0) return Usuń(L);
  687. int licznik = 0;
  688. for (Lista tmp = L; tmp.następny != null; tmp = tmp.następny, licznik++)
  689. if (licznik == i - 1)
  690. {
  691. tmp.następny = tmp.następny.następny;
  692. return L;
  693. }
  694. throw new Exception("indeks poza zakresem!");
  695. }
  696.  
  697. Implementacja obiektowa listy dowiązaniowej
  698. Algorytmy i Struktury Danych 26
  699. public class Węzeł
  700. {
  701. public int dane;// w węźle przechowujemy liczbę
  702. public Węzeł następny; // oraz referencję do następnego
  703. }
  704. class Lista
  705. {
  706. Węzeł głowa = null;
  707. public bool CzyPusta()
  708. {
  709. return głowa == null;
  710. }
  711. public int PodajRozmiar()
  712. {
  713. int licznik = 0;
  714. for (Węzeł tmp = głowa; tmp != null; tmp = tmp.następny)
  715. licznik++;
  716. return licznik;
  717. }
  718. public void Dodaj(int liczba) //Do głowy
  719. {
  720. Węzeł tmp = new Węzeł(); // nowy węzeł
  721. tmp.dane = liczba;
  722. tmp.następny = głowa; //głowa staje się "następny"
  723. głowa = tmp;// dodany element staje się głową
  724. }
  725. public void Usuń() //Z głowy
  726. {
  727. if (głowa != null) // sprawdzamy, czy lista nie jest pusta
  728. głowa = głowa.następny;
  729. }
  730. public int Podaj(int i) //i-ty element
  731. {
  732. int licznik = 0;
  733. for (Węzeł tmp = głowa; tmp != null; tmp = tmp.następny)
  734. if (licznik++ == i) return tmp.dane;
  735. throw new Exception("indeks poza zakresem!");
  736. }
  737. public int CzyZawiera(int n) //element o wartości n
  738. {
  739. int licznik = 0;
  740. for (Węzeł tmp = głowa; tmp != null; tmp = tmp.następny, licznik++)
  741. if (tmp.dane == n) return licznik;
  742. return -1;
  743. }
  744. //…
  745. }
  746.  
  747.  
  748. mplementacja obiektowa listy na tablicy
  749. Algorytmy i Struktury Danych 29
  750. class Lista
  751. {
  752. int[] dane = new int[pojemność];
  753. int rozmiar = 0;
  754. const int pojemność = 1000; // stała
  755. public bool CzyPusta()
  756. {
  757. return rozmiar == 0;
  758. }
  759. public int PodajRozmiar()
  760. {
  761. return rozmiar;
  762. }
  763. public void Dodaj(int liczba) //na koniec
  764. {
  765. if (rozmiar == pojemność)
  766. throw new Exception("brak miejsca!");
  767. dane[rozmiar] = liczba;
  768. rozmiar++;
  769. }
  770. public void Usuń() //z końca
  771. {
  772. if (rozmiar > 0) rozmiar--;
  773. }
  774. public int Podaj(int i) //i-ty element
  775. {
  776. if (i >= 0 && i < rozmiar) return dane[i];
  777. throw new Exception("indeks poza zakresem!");
  778. }
  779. public int CzyZawiera(int n) //element o wartości n
  780. {
  781. for (int i = 0; i < rozmiar; i++)
  782. {
  783. if (dane[i] == n) return i;
  784. }
  785. return -1;
  786. }
  787. //łączy dwie listy "dokleja" do pierwszej drugą
  788. public void Dołącz(Lista LB)
  789. {
  790. if (rozmiar + LB.rozmiar > pojemność)
  791. throw new Exception("brak miejsca!");
  792. for (int i = 0; i < LB.rozmiar; i++)
  793. dane[i + rozmiar] = LB.dane[i];
  794. rozmiar += LB.rozmiar;
  795. }
  796. //…
  797. }
  798.  
  799. Implementacja stosu z dowiązaniami
  800. class Stos
  801. {
  802. Węzeł wierzchołek = null;
  803. public bool CzyPusty()
  804. {
  805. return wierzchołek == null;
  806. }
  807. public void Połóż(int liczba) //na wierzchołek
  808. {
  809. Węzeł tmp = new Węzeł(); // nowy węzeł
  810. tmp.dane = liczba;
  811. tmp.następny = wierzchołek;//dotychczasowy wierzchołek staje się "następny"
  812. wierzchołek = tmp;// dodany element staje się wierzchołkiem
  813. }
  814. //…
  815. }
  816.  
  817.  
  818. mplementacja stosu z dowiązaniami c.d.
  819. public int Zdejmij() //Z wierzchołka
  820. {
  821. int v;
  822. if (wierzchołek != null) // sprawdzamy, czy stos nie jest pusty
  823. {
  824. v = wierzchołek.dane;
  825. wierzchołek = wierzchołek.następny;
  826. }
  827. else
  828. {
  829. throw new Exception("stos pusty!");
  830. }
  831. return v;
  832. }
  833. public int Podejrzyj() //co na wierzchołku
  834. {
  835. if (wierzchołek != null) // sprawdzamy, czy stos nie jest pusty
  836. {
  837. return wierzchołek.dane;
  838. }
  839. else
  840. {
  841. throw new Exception("stos pusty!");
  842. }
  843. }
  844.  
  845.  
  846. Implementacja tablicowa stosu
  847. class StosT
  848. {
  849. int wierzchołek = 0; const int rozmiar = 100;
  850. int[] dane = new int[rozmiar];
  851. public bool CzyPusty()
  852. {
  853. return wierzchołek == 0;
  854. }
  855. public void Połóż(int liczba) //na wierzchołek
  856. {
  857. if (wierzchołek < rozmiar) dane[wierzchołek++] = liczba;
  858. else throw new Exception("stos pełny!");
  859. }
  860. public int Zdejmij() //Z wierzchołka
  861. {
  862. if (wierzchołek != 0) // sprawdzamy, czy stos nie jest pusty
  863. return dane[--wierzchołek];
  864. else throw new Exception("stos pusty!");
  865. }
  866. public int Podejrzyj() //co na wierzchołku
  867. {
  868. if (wierzchołek != 0) // sprawdzamy, czy stos nie jest pusty
  869. return dane[wierzchołek - 1];
  870. else throw new Exception("stos pusty!");
  871. }
  872. }
  873.  
  874. Implementacja stosu w.NET - przykłady
  875. Stack myStack = new Stack();
  876. myStack.Push(22);
  877. myStack.Push(33);
  878. myStack.Push(44);
  879. Console.WriteLine(myStack.Peek());
  880. Console.WriteLine();
  881. while (myStack.Count>0)
  882. Console.Write(myStack.Pop()+" ");
  883. Algorytmy i Struktury Danych 40
  884. Stack<int> myStack = new Stack<int>();
  885. myStack.Push(22);
  886. myStack.Push(33);
  887. myStack.Push(44);
  888. Console.WriteLine(myStack.Peek());
  889. Console.WriteLine();
  890. while (myStack.Count > 0)
  891. Console.Write(myStack.Pop() + " ");
  892.  
  893.  
  894. Implementacja kolejki z dowiązaniami
  895. class KolejkaS
  896. {
  897. Węzeł głowa = null; Węzeł ogon = null;
  898. public static bool CzyPusta(KolejkaS q)
  899. {
  900. return q.głowa == null;
  901. }
  902. public static int Usuń(KolejkaS q) //Z początku
  903. {
  904. if (q.głowa != null) // sprawdzamy, czy kolejka nie jest pusta
  905. {
  906. int v = q.głowa.dane; q.głowa = q.głowa.następny;
  907. if (q.głowa == null) q.ogon = null;
  908. return v;
  909. }
  910. else throw new Exception("kolejka pusta!");
  911. }
  912. //…
  913. }
  914. Algorytmy i Struktury Danych 42
  915. public class Węzeł
  916. {
  917. public int dane;// w węźle przechowujemy liczbę
  918. public Węzeł następny; // oraz referencję do następnego
  919. }
  920. Implementacja kolejki z dowiązaniami c.d.
  921. public static int Podejrzyj(KolejkaS q) //co na początku ?
  922. {// sprawdzamy, czy kolejka nie jest pusta
  923. if (q.głowa != null) return q.głowa.dane;
  924. else throw new Exception("kolejka pusta!");
  925. }
  926. //dodaje element o wartości n na koniec
  927. public static void Dodaj(KolejkaS q, int n)
  928. {
  929. Węzeł l = new Węzeł();
  930. l.dane = n; l.następny = null;
  931. if (q.głowa == null) q.głowa = q.ogon = l;
  932. else { q.ogon.następny = l; q.ogon = l; }
  933. return;
  934. }
  935.  
  936. Implementacja tablicowa kolejki FIFO(1)
  937. class KolejkaT
  938. {
  939. int głowa = 0;
  940. int ogon = 0;
  941. const int rozmiar = 30;
  942. int[] dane = new int[rozmiar];
  943. public bool CzyPusta()
  944. {
  945. return ogon == głowa;
  946. }
  947. public int Usuń() //Z początku
  948. {
  949. if (głowa != ogon) // sprawdzamy, czy kolejka nie jest pusta
  950. {
  951. return dane[głowa++];
  952. }
  953. else throw new Exception("kolejka pusta!");
  954. }
  955. Implementacja tablicowa kolejki FIFO(2)
  956. public int Podejrzyj() //na początku
  957. {
  958. if (głowa != ogon) // sprawdzamy, czy kolejka nie jest pusta
  959. {
  960. return dane[głowa];
  961. }
  962. else throw new Exception("kolejka pusta!");
  963. }
  964. public void Dodaj(int n) //dodaje element o wartości n na koniec
  965. {
  966. if (ogon < rozmiar)
  967. {
  968. dane[ogon++] = n;
  969. }
  970. // tutaj mógłbym próbować przeorganizować kolejkę
  971. else throw new Exception("nie ma miejsca!");
  972. return;
  973. }
  974.  
  975. Implementacja cykliczna tablicowa kolejki(1)
  976. class KolejkaC
  977. {
  978. int głowa = 0; int ogon = 0;
  979. const int rozmiar = 10;
  980. int[] dane = new int[rozmiar];
  981. int licznik = 0;
  982. public bool CzyPusta()
  983. {
  984. return licznik == 0;
  985. }
  986. public int Usuń() //Z początku
  987. {
  988. if (licznik != 0) // sprawdzamy, czy kolejka nie jest pusta
  989. {
  990. int v = dane[głowa];
  991. głowa = (głowa + 1) % rozmiar;
  992. licznik--;
  993. return v;
  994. }
  995. else
  996. throw new Exception("kolejka pusta!");
  997. }
  998.  
  999.  
  1000. Implementacja cykliczna tablicowa kolejki(2)
  1001. public int Podejrzyj() //co na początku
  1002. {
  1003. if (licznik != 0) // sprawdzamy, czy kolejka nie jest pusta
  1004. {
  1005. return dane[głowa];
  1006. }
  1007. else
  1008. throw new Exception("kolejka pusta!");
  1009. }
  1010. public void Dodaj(int n) //dodaje element o wartości n na koniec
  1011. {
  1012. if (licznik == rozmiar)
  1013. throw new Exception("zakres przekroczony!");
  1014. dane[ogon] = n;
  1015. ogon = (ogon + 1) % rozmiar;
  1016. licznik++;
  1017. return;
  1018. }
  1019. }
  1020.  
  1021.  
  1022. Implementacja kolejki w.NET - przykłady
  1023. Queue myQueue = new Queue();
  1024. myQueue.Enqueue(22);
  1025. myQueue.Enqueue(33);
  1026. myQueue.Enqueue(44);
  1027. Console.WriteLine(myQueue.Peek());
  1028. Console.WriteLine();
  1029. while (myQueue.Count > 0)
  1030. Console.Write(myQueue.Dequeue() + " ");
  1031. Algorytmy i Struktury Danych 51
  1032. Queue<int> myQueue = new Queue<int>();
  1033. myQueue.Enqueue(22);
  1034. myQueue.Enqueue(33);
  1035. myQueue.Enqueue(44);
  1036. Console.WriteLine(myQueue.Peek());
  1037. Console.WriteLine();
  1038. while (myQueue.Count > 0)
  1039. Console.Write(myQueue.Dequeue() + "
  1040.  
  1041. Sortowanie kubełkowe – kod w C#
  1042. static void Kubelkowe(int[] D, int m)
  1043. {
  1044. int N = D.Length; int min = D[0]; int max = D[0];
  1045. for (int i = 1; i < N; i++)
  1046. { if (min > D[i]) min = D[i]; if (max < D[i]) max = D[i]; }
  1047. // tworzymy m kubelkow bardzo pojemnych
  1048. int[,] kubelki = new int[m, N + 1];
  1049. for (int i = 0; i < m; i++) kubelki[i, N] = 0; // zerujemy liczni ki kubelkow
  1050. // dodajemy do odpowiednich kubelkow wartości elementów sortowanego zbioru
  1051. for (int i = 0; i < N; i++)
  1052. {
  1053. int num = ((D[i] - min) * m) / (max - min + 1);
  1054. kubelki[num, kubelki[num, N]++] = D[i];
  1055. }
  1056. // sortowanie w kubełkach
  1057. for (int i = 0; i < m; i++) SortujWKubelku(kubelki, i);
  1058. int j = 0; // laczenie kubelkow
  1059. for (int i = 0; i < m; i++)
  1060. for (int k = 0; k < kubelki[i, N]; k++)
  1061. { D[j] = kubelki[i, k]; j++; }
  1062. }
  1063. Algorytmy i Struktury Danych 54
  1064. static void SortujWKubelku(int[,] L, int m)
  1065. {
  1066. // sortowanie m-tego kubelka przez wstawianie
  1067. int k, j;
  1068. int M = L[m, L.GetLength(1) - 1]; // ilosc elementow
  1069. for (int i = 1; i < M; i++)
  1070. {
  1071. k = L[m, i]; j = i;
  1072. while (j > 0 && L[m, j - 1] > k)
  1073. { L[m, j] = L[m, j - 1]; j--; }
  1074. L[m, j] = k; // wstawiam w odpowiednie miejsce
  1075. }
  1076. }
  1077.  
  1078. Sortowanie kubełkowe z listami – kod w C#
  1079. static void Kubelkowe(int[] D, int m)
  1080. {
  1081. int N = D.Length;
  1082. int min = D[0];
  1083. int max = D[0];
  1084. for (int i = 1; i < N; i++)
  1085. {
  1086. if (min > D[i]) min = D[i];
  1087. if (max < D[i]) max = D[i];
  1088. }
  1089. // tworzymy m kubelkow
  1090. List<int>[] kubelki = new List<int>[m];
  1091. for (int i = 0; i < m; i++) kubelki[i] = new List<int>();
  1092. // dodajemy do odpowiednich kubelkow wartości elementów
  1093. for (int i = 0; i < N; i++)
  1094. {
  1095. int num = ((D[i] - min) * m) / (max - min + 1);
  1096. kubelki[num].Add(D[i]);
  1097. }
  1098.  
  1099. Algorytmy i Struktury Danych 57
  1100. // sortowanie w kubełkach
  1101. for (int i = 0; i < m; i++)
  1102. kubelki[i].Sort();
  1103. // laczenie kubelkow
  1104. int j = 0;
  1105. for (int i = 0; i < m; i++)
  1106. for (int k = 0; k < kubelki[i].Count; k++)
  1107. {
  1108. D[j] = kubelki[i][k];
  1109. j++;
  1110. }
  1111. }
  1112.  
  1113. Laboratorium 9 - Drzewa.Drzewa binarne.
  1114. drzewo dowiązaniowe
  1115. [code csharp]
  1116.  
  1117. using System;
  1118. using System.Collections;
  1119.  
  1120. // klasa pomocnicza Węzeł
  1121. class Węzeł
  1122. {
  1123. public String wartość;
  1124. public ArrayList dzieci;
  1125. }
  1126.  
  1127. // klasa Drzewo
  1128. class Drzewo
  1129. {
  1130. public Węzeł korzeń;
  1131. }
  1132.  
  1133. class Program
  1134. {
  1135. static Węzeł UtwórzWęzeł(String wartość)
  1136. {
  1137. Węzeł węzeł = new Węzeł();
  1138. węzeł.wartość = wartość;
  1139. węzeł.dzieci = new ArrayList();
  1140. return węzeł;
  1141. }
  1142.  
  1143. static void InicjujWęzeł(Węzeł węzeł, String wartość)
  1144. {
  1145. węzeł.wartość = wartość;
  1146. węzeł.dzieci = new ArrayList();
  1147. }
  1148.  
  1149. static void DodajWęzeł(Węzeł węzeł, Węzeł dziecko)
  1150. {
  1151. węzeł.dzieci.Add(dziecko);
  1152. }
  1153.  
  1154. // pre-order
  1155. static void Wypisuj(Węzeł węzeł)
  1156. {
  1157. Console.Write("(" + węzeł.wartość);
  1158. if (węzeł.dzieci.Count > 0)
  1159. {
  1160. for (int i = 0; i < węzeł.dzieci.Count; i++)
  1161. {
  1162. Wypisuj((Węzeł)węzeł.dzieci[i]);
  1163. }
  1164. }
  1165. Console.Write(")");
  1166. }
  1167.  
  1168. // post-order
  1169. static void WypisujPost(Węzeł węzeł)
  1170. {
  1171. // najpierw wypisujemy potomków
  1172. if (węzeł.dzieci.Count > 0)
  1173. {
  1174. for (int i = 0; i < węzeł.dzieci.Count; i++)
  1175. {
  1176. WypisujPost((Węzeł)węzeł.dzieci[i]);
  1177. }
  1178. }
  1179. // potem rodzica
  1180. Console.Write(" " + węzeł.wartość);
  1181. }
  1182.  
  1183.  
  1184. static int Wysokość(Węzeł węzeł)
  1185. {
  1186. int wysokość = 0;
  1187. for (int i = 0; i < węzeł.dzieci.Count; i++)
  1188. {
  1189. Węzeł następnik = (Węzeł)węzeł.dzieci[i];
  1190. wysokość = Math.Max(wysokość, Wysokość(następnik) + 1);
  1191. }
  1192. return wysokość;
  1193. }// Zwraca wynik
  1194.  
  1195.  
  1196. static void Main()
  1197. {
  1198. Drzewo drzewo = new Drzewo();
  1199.  
  1200. drzewo.korzeń = UtwórzWęzeł("F");
  1201. Węzeł wB = UtwórzWęzeł("B");
  1202. Węzeł wA = UtwórzWęzeł("A");
  1203. Węzeł wC = UtwórzWęzeł("C");
  1204. Węzeł wD = UtwórzWęzeł("D");
  1205. Węzeł wE = UtwórzWęzeł("E");
  1206. Węzeł wG = UtwórzWęzeł("G");
  1207. Węzeł wH = UtwórzWęzeł("H");
  1208. Węzeł wI = UtwórzWęzeł("I");
  1209.  
  1210. DodajWęzeł(wD, wC);
  1211. DodajWęzeł(wD, wE);
  1212. DodajWęzeł(wB, wA);
  1213. DodajWęzeł(wB, wD);
  1214.  
  1215. DodajWęzeł(wI, wH);
  1216. DodajWęzeł(wG, wI);
  1217.  
  1218. DodajWęzeł(drzewo.korzeń, wB);
  1219. DodajWęzeł(drzewo.korzeń, wG);
  1220.  
  1221. Wypisuj(drzewo.korzeń);
  1222. Console.WriteLine();
  1223. WypisujPost(drzewo.korzeń);
  1224. Console.WriteLine();
  1225. Console.WriteLine("wysokość = " + Wysokość(drzewo.korzeń));
  1226.  
  1227. Console.ReadKey();
  1228. }
  1229. }
  1230.  
  1231. Laboratorium 9 - Drzewa.Drzewa binarne.
  1232. drzewo binarne
  1233. [code csharp]
  1234.  
  1235. using System;
  1236. using System.Collections;
  1237.  
  1238. // klasa pomocnicza Węzeł
  1239. class Węzeł
  1240. {
  1241. public String wartość;
  1242. public Węzeł lewy;
  1243. public Węzeł prawy;
  1244. }
  1245.  
  1246. // klasa Drzewo
  1247. class Drzewo
  1248. {
  1249. public Węzeł korzeń;
  1250. }
  1251.  
  1252. class Program
  1253. {
  1254. static Węzeł UtwórzWęzeł(String wartość)
  1255. {
  1256. Węzeł węzeł = new Węzeł();
  1257. węzeł.wartość = wartość;
  1258. return węzeł;
  1259. }
  1260.  
  1261. static void InicjujWęzeł(Węzeł węzeł, String wartość)
  1262. {
  1263. węzeł.wartość = wartość;
  1264. }
  1265.  
  1266. static void DodajLewy(Węzeł węzeł, Węzeł dziecko)
  1267. {
  1268. węzeł.lewy = dziecko;
  1269. }
  1270. static void DodajPrawy(Węzeł węzeł, Węzeł dziecko)
  1271. {
  1272. węzeł.prawy = dziecko;
  1273. }
  1274.  
  1275. // pre-order
  1276. static void WypisujPre(Węzeł węzeł)
  1277. {
  1278. if (węzeł == null) return;
  1279. Console.Write(węzeł.wartość + " ");
  1280. WypisujPre((Węzeł)węzeł.lewy);
  1281. WypisujPre((Węzeł)węzeł.prawy);
  1282. }
  1283.  
  1284. // post-order
  1285. static void WypisujPost(Węzeł węzeł)
  1286. {
  1287. if (węzeł == null) return;
  1288. WypisujPost((Węzeł)węzeł.lewy);
  1289. WypisujPost((Węzeł)węzeł.prawy);
  1290. Console.Write(węzeł.wartość + " ");
  1291. }
  1292.  
  1293. // in-order
  1294. static void WypisujIn(Węzeł węzeł)
  1295. {
  1296. if (węzeł == null) return;
  1297. WypisujIn((Węzeł)węzeł.lewy);
  1298. Console.Write(węzeł.wartość + " ");
  1299. WypisujIn((Węzeł)węzeł.prawy);
  1300. }
  1301.  
  1302. static int Wysokość(Węzeł węzeł)
  1303. {
  1304. int wysokość = 0;
  1305. if (węzeł == null) return 0;
  1306. if (węzeł.lewy != null)
  1307. wysokość = Math.Max(wysokość, Wysokość(węzeł.lewy) + 1);
  1308. if (węzeł.prawy != null)
  1309. wysokość = Math.Max(wysokość, Wysokość(węzeł.prawy) + 1);
  1310. return wysokość;
  1311. }// Zwraca wynik
  1312.  
  1313.  
  1314. static void Main()
  1315. {
  1316. Drzewo drzewo = new Drzewo();
  1317.  
  1318. drzewo.korzeń = UtwórzWęzeł("F");
  1319. Węzeł wB = UtwórzWęzeł("B");
  1320. Węzeł wA = UtwórzWęzeł("A");
  1321. Węzeł wC = UtwórzWęzeł("C");
  1322. Węzeł wD = UtwórzWęzeł("D");
  1323. Węzeł wE = UtwórzWęzeł("E");
  1324. Węzeł wG = UtwórzWęzeł("G");
  1325. Węzeł wH = UtwórzWęzeł("H");
  1326. Węzeł wI = UtwórzWęzeł("I");
  1327.  
  1328. DodajLewy(wD, wC);
  1329. DodajPrawy(wD, wE);
  1330. DodajLewy(wB, wA);
  1331. DodajPrawy(wB, wD);
  1332.  
  1333. DodajLewy(wI, wH);
  1334. DodajPrawy(wG, wI);
  1335.  
  1336. DodajLewy(drzewo.korzeń, wB);
  1337. DodajPrawy(drzewo.korzeń, wG);
  1338.  
  1339. WypisujPre(drzewo.korzeń);
  1340. Console.WriteLine();
  1341. WypisujPost(drzewo.korzeń);
  1342. Console.WriteLine();
  1343. WypisujIn(drzewo.korzeń);
  1344. Console.WriteLine();
  1345. Console.WriteLine("wysokość = " + Wysokość(drzewo.korzeń));
  1346.  
  1347. Console.ReadKey();
  1348. }
  1349. }
  1350.  
  1351.  
  1352. [/code]
  1353.  
  1354. code csharp]
  1355.  
  1356. using System;
  1357. using System.Collections;
  1358.  
  1359.  
  1360. // klasa Drzewo
  1361. class Drzewo
  1362. {
  1363. public string[] drzewo = new string[31];
  1364. public int ilość = 0;
  1365. }
  1366.  
  1367. class Program
  1368. {
  1369. static void DodajWęzeł(Drzewo d, string s)
  1370. {
  1371. d.drzewo[d.ilość++] = s;
  1372. }
  1373.  
  1374. // pre-order
  1375. static void WypisujPre(Drzewo d, int i)
  1376. {
  1377. if (i >= d.ilość) return;
  1378. Console.Write(d.drzewo[i] + " ");
  1379. WypisujPre(d, 2 * i + 1);
  1380. WypisujPre(d, 2 * i + 2);
  1381. }
  1382.  
  1383. // post-order
  1384. static void WypisujPost(Drzewo d, int i)
  1385. {
  1386. if (i >= d.ilość) return;
  1387. WypisujPost(d, 2 * i + 1);
  1388. WypisujPost(d, 2 * i + 2);
  1389. Console.Write(d.drzewo[i] + " ");
  1390. }
  1391.  
  1392. // in-order
  1393. static void WypisujIn(Drzewo d, int i)
  1394. {
  1395. if (i >= d.ilość) return;
  1396. WypisujIn(d, 2 * i + 1);
  1397. Console.Write(d.drzewo[i] + " ");
  1398. WypisujIn(d, 2 * i + 2);
  1399. }
  1400.  
  1401. static int Wysokość(Drzewo d)
  1402. {
  1403. int wysokość = 0, p = d.ilość / 2;
  1404. while (p > 0)
  1405. {
  1406. p = p / 2;
  1407. wysokość++;
  1408. }
  1409. return wysokość;
  1410. }// Zwraca wynik
  1411.  
  1412.  
  1413. static void Main()
  1414. {
  1415. Drzewo drzewo = new Drzewo();
  1416. DodajWęzeł(drzewo, "A");
  1417. DodajWęzeł(drzewo, "B");
  1418. DodajWęzeł(drzewo, "D");
  1419. DodajWęzeł(drzewo, "E");
  1420. DodajWęzeł(drzewo, "C");
  1421. DodajWęzeł(drzewo, "H");
  1422. DodajWęzeł(drzewo, "I");
  1423. DodajWęzeł(drzewo, "K");
  1424. DodajWęzeł(drzewo, "F");
  1425. DodajWęzeł(drzewo, "G");
  1426. DodajWęzeł(drzewo, "L");
  1427. DodajWęzeł(drzewo, "M");
  1428. DodajWęzeł(drzewo, "J");
  1429.  
  1430. WypisujPre(drzewo, 0);
  1431. Console.WriteLine();
  1432. WypisujPost(drzewo, 0);
  1433. Console.WriteLine();
  1434. WypisujIn(drzewo, 0);
  1435. Console.WriteLine();
  1436. Console.WriteLine("wysokość = " + Wysokość(drzewo));
  1437.  
  1438. Console.ReadKey();
  1439. }
  1440. }
  1441.  
  1442. [/code]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement