Struktury danych. przez użytkownika, jak to ma miejsce w przypadku zwykłych zmiennych statycznych.

Podobne dokumenty
Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Listy, kolejki, stosy

Algorytmy i Struktury Danych.

Porządek symetryczny: right(x)

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Struktury danych: stos, kolejka, lista, drzewo

Algorytmy i Struktury Danych.

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Dynamiczne struktury danych

Drzewa wyszukiwań binarnych (BST)

Wysokość drzewa Głębokość węzła

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Wykład 6. Drzewa poszukiwań binarnych (BST)

Algorytmy i struktury danych. wykład 5

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Dynamiczne struktury danych

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Podstawy Informatyki. Wykład 6. Struktury danych

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Wykład 2. Drzewa poszukiwań binarnych (BST)

Wykład 6. Dynamiczne struktury danych

Algorytmy i Struktury Danych.

dr inż. Paweł Myszkowski Wykład nr 11 ( )

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

E S - uniwersum struktury stosu

Wstęp do programowania

Algorytmy i Struktury Danych.

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Algorytmy i Struktury Danych.

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

Drzewa poszukiwań binarnych

Podstawowe struktury danych

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >

Algorytmy i Struktury Danych

Algorytmy i struktury danych

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski

Algorytmy i Struktury Danych

Drzewa poszukiwań binarnych


INFORMATYKA. Podstawy programowania w języku C. (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Lista 5 Typy dynamiczne kolejka

ALGORYTMY I STRUKTURY DANYCH

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola:

Podstawy Informatyki. Metody dostępu do danych

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Abstrakcyjne struktury danych - stos, lista, drzewo

Algorytmy i Struktury Danych

Egzaminy i inne zadania. Semestr II.

Zmienne i struktury dynamiczne

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru.

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Kompletna dokumentacja kontenera C++ vector w -

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

dodatkowe operacje dla kopca binarnego: typu min oraz typu max:

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Przykładowe B+ drzewo

ZASADY PROGRAMOWANIA KOMPUTERÓW

Analiza algorytmów zadania podstawowe

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

Struktury. Przykład W8_1

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

Algorytmy sortujące i wyszukujące

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Algorytmy i Struktury Danych.

Teoretyczne podstawy informatyki

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Podstawy Programowania C++

Tadeusz Pankowski

. Podstawy Programowania 2. Drzewa bst - część pierwsza. Arkadiusz Chrobot. 22 maja 2016

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

PLIKI TEKSTOWE F C E 30 0D 0A 42 6F 72 6C 61 6E 64 1A T U R B O _ P A S C A L _ 7. 0

Podstawy programowania skrót z wykładów:

Drzewa czerwono-czarne.

Stos LIFO Last In First Out

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

Plan wykładu. Klucz wyszukiwania. Pojęcie indeksu BAZY DANYCH. Pojęcie indeksu - rodzaje indeksów Metody implementacji indeksów.

WSTĘP DO INFORMATYKI. Struktury liniowe

Ogólne wiadomości o grafach

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Zasady programowania Dokumentacja

Abstrakcyjne struktury danych w praktyce

INFORMATYKA DANE.

wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK

PODSTAWY INFORMATYKI wykład 6.

1 Wskaźniki i listy jednokierunkowe

Transkrypt:

Struktury danych 1. Dynamiczne struktury danych Zmienna dynamiczna jest to zmienna, która pojawia się(i znika) wtedy gdy jest potrzebna(lub nie jest) podczas wykonywania się programu. Zwykłe zmienne statyczne, istnieją przez cały czas wykonywania się programu. Odwołania do zmiennychdynamicznychodbywająsiępoprzezwskazy 1,anieprzeznazwydefiniowane przez użytkownika, jak to ma miejsce w przypadku zwykłych zmiennych statycznych. W skazy. Sytuację tę możemy graficznie przedstawić tak jak pokazano niżej. w z Wskaz w (pointer) pokazuje jakąś wielkość z, której wartość umieszczona jest w jakimś miejscu pamięci komputera(reprezentowanym na rysunku przez prostokąt). Jak zadeklarować zmienną dynamiczną? Można dokonać tego przez zgłoszenie, zdefiniowanie typu( patrz diagram poniżej). -->( type )-->[ Nazwa typu ]-->( = )-->( ^ )-->[ Typ bazowy ]-->( ; )--> Przykład. type intwskaz=\^{~}integer;\\ var iw: intwskaz; W ten sposób iw jest zmienną wskazującą wielkości typu integer. Wartość zmiennej wskazanej przez iw jest zadana przez iw^. iw 5 iw^=5. W przedstawionej sytuacji wartość zmiennej pokazywanej przez iw jest równa 5(to zawartość obszaru wskazywanego przez iw). Przykład. Innym przykładem jest zmienna wk typu wrek zdefiniowana następująco: type wrek=^kalendarz kalendarz=record miesiac: (Sty,Lut,Mar,Kwi,Maj,Cze,Lip,Sie,Wrz,Paz,Lis,Gru); dzien : 1..31 1 Czasamiużywasięteżnazwywskaźnikicomożesięmylićzewskaźnikamitabliclubnazwy angielskiej pointers. 1

end; var wk: wrek; Zmienna wk jest wskazem do zmiennej o dwóch polach skalarnych: miesiac i dzien. wk Gru 28 Pola rekordu zawierającego fragment kalendarza są dostępne poprzez następujące wielkości wk^.miesiac wk^.dzien Istnieją dwie procedury Turbo Pascala, które tworzą lub usuwają(niszczą) zmienne dynamiczne. Są to new(p) oraz dispose(p) Wywołanie procedury new(p) powoduje nadanie wartości wskazowi p oraz utworzenie zmiennej wskazywanej przez p. Wywołanie podprogramu dispose(p) powoduje zwolnienie pamięci zarezerwowanej dla zmiennej wskazywanej przez p oraz"wyzerowanie"p: p=nil. Wielkość nil jest słowem zarezerwowanym języka Pascal i oznacza ńic". Zmienna o wartościnil nic nie pokazuje. Wskazy mogą pokazywać złożone struktury danychpascala. Mogą to być np. drzewa binarne (patrz dalej). A /\ / \ / \ / \ B E /\ /\ / \ / \ / \ / \ C D F G / /\ I J K / \ Drzewo binarne type wskaz=^wezel; wezel=record lewywskaz : wskaz; nazwa : char prawywskaz: wskaz; end; var p, root: wskaz; 2

Każdy węzeł zawiera trzy pola: dwa wskazania do innych węzłów, lewego i prawego (lewywskaz, prawywskaz) oraz "wartość", nazwa, którą jest pojedynczy znak. Chcę zwrócić uwagę, że nie deklarujemy zmiennych typu wezel lecz wskazy! do zmiennych tego typu. Są to wskazy p oraz root. Chcąc utworzyć drzewo o jednym węźle napiszemy new(root); { rezerwacja miejsca + nadanie wartości zmiennej root } root^.nazwa:= a ; { definicja pola nazwy węzła } root^.lewywskaz:=nil; { brak węzła z lewej strony } root^.prawywskaz:=nil; { brak węzła z prawej strony } Schematycznie ygląda to następująco: root nil a nil Jeśli chcemy by któryś ze wskazów pokazywał inny węzeł, tak jak np. tutaj root nil a * nil b nil to możemy to zapisać tak new(p); { rezerwacja miejsca + nadanie wartości zmiennej p } root^.prawywskaz:=p; { prawy wskaz pokazuje nowy węzeł } p^.nazwa:= b ; { definicja pola nazwy węzła } p^.lewywskaz:=nil; { brak węzła z lewej strony } p^.prawywskaz:=; { brak węzła z prawej strony } Jeśli teraz chcielibyśmy usunąć utworzony właśnie węzeł, zapiszemy: root^.prawywskaz:=nil; dispose(p) { usuwa zarezerwowaną wcześniej przestrzeń zajmowaną przez zmienną wskazywaną przez p } L isty jednostronne. Przykładem zastosowania rekordów i wskazów jest jednostronna lista połączona. Jest to struktura, której węzły zawierają dane i pokazują następne elementy listy. -nagłówek- dane dane... dane Włączanie nowych elementów do listy jednostronnej. Załóżmy, że mamy następującą listę. 5 10 15 Jeśli między dwa elementy, np. [10 ], [15 ] tej listy, chcemy wprowadzić element [12 ] wystarczy zarezerwować miejsce w pamięci na element 3

[12 ]. W elemencie [12 ] wstawić wartość wskazu do elementu [15 ] i następnie wstawić wartość wskazu do elementu [12 ] w elemencie [10 ]. Przykładem konkretnej realizacji może być terminarz spotkań, który zawiera godzinę, nazwisko osoby oraz wskażuje następne spotkanie. Wykonanie terminarza przy użyciu tablic nie byłoby tak proste jak to z użyciem list. Napiszemy program, który definiuje listę spotkań. Przykład. type wsk=^spotkania; spotkania=record dane=record osoba: array[1..20] of char; godzina: 0..23; minuta: 0..59 end; nastepny: wsk { wskaz do następnego spotkania } end; var naglowek: wsk; Zadanie 1. Organizator spotkań 3 Napisz program, organizator spotkań, który pozwala założyć i modyfikować listę spotkań (wstawiać, usuwać). Elementami listy niech będą godzina, minuta, osoba (nazwisko) i miejsca spotkania (adres). M acierze kwadratowe. Duże macierze kwadratowe, np. macierz o wymiarach 5000 5000, czyli zawierająca 25000000 elementów, stwarzają duży problem numeryczny. Jak zorganizować dane i program, który musi nimi operować? Jednym z możliwych rozwiązań jest następujące. Można wczytywać z pliku jeden wiersz macierzy i mieć szybki dostęp do 5000 elementów na raz. Co jednak zrobić gdy potrzebne są dwa lub więcej wierszy na raz? Tak jest np. w przypadku mnożenia macierzy. Zadanie 2. Złożoność 2 Napisz program, który czyta plik z tablicą liczb rzeczywistych o wymiarach 1000 1000. Oceń stopień złożoności programu. Znajdż czas obliczania sumy elementów takiej tablicy. Zadanie 3. Wyznacznik 2 Policz wyznacznik tablicy 1000 1000 złożonej z liczb losowych z przedziału <0,1> wygenerowanych przez funkcje rand()turbo Pascala. Literatura: Cormen Leiserson, Rievest,... Do dynamicznych struktur danych należą stosy, kolejki, drzewa itp. Jak zawsze, z każdym typem danych, związane są typowe dla danej struktury operacje. Operacje wykonywane na zbiorach dynamicznych, takie jak wstawianie elementów, usuwanie elementów oraz sprawdzanie przynależności elementu do zbioru można podzielić nazapytania i operacjemodyfikujace. Są to Search, Insert, Delete, Minimum, Maximum, Successor, Predecessor, itp. W kolejnych częściach omówimy różne struktury danych dynamicznych wraz z odpowiadającymi im operacjami. 4

1.1. Stosy, kolejki, listy, drzewa S tos S jest dynamiczną strukturą danych, w której element najpóźniej dodany do struktury usuwany jest jako pierwszy (Last in, First out; jest to tzw. struktura LiFo). Zwyczajowo, operacja Insert nosi nazwę Push, a operacja Delete nazywa siępop. Przykłady: stos talerzy w barach samoobsługowych, stos rozkazów i danych w pamięci komputera, itp. Stos o liczbie elementów nie większej niżnmożna zaimplementować w tablicy S[1..n]. Dodatkowa cecha (atrybut)top[s] określa aktualną długość stosu S. Elementem na dnie stosu jest S[1], a S[top[S]] jest ostatnim elementem stosu. Jeśli top[s] = 0 to stos jest pusty (Stack-Empty). Próba zdjęcia elementu ze stosu pustego nazywa sięniedomiarem., W przypadku gdy top[s] > n (przekroczona dopuszczalna długość stosu) mówimy, że stos jestprzepełniony. Poniżej przedstawione są algorytmy typowych operacji na stosach. Stack-Empty(S) 1 if top[s]=0 2 then return True 3 else return False Push(S,x) 1 top[s] <- top[s]+1 2 S[top[S]] <- x Pop(S) 1 if Stack-Empty(S) 2 then error,,niedomiar 3 else top[s] <- top[s]-1 4 return S[top[S]+1] Rysunek przedstawia działanie operacji Push i Pop na stosie S. (a) (b) (c) 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 xxxxx xxxxxxxxxxxxxx S 12 5 7 8 2xxxxxxxxxxxxxxxxxxxxx S 12 5 7 8 2 4 3xxxxxxxxxxxxxx xxxxx S 4 xxxxx 3 xxxxx xxxxx 12 5 7 8 2 xxxxx top[s]=5 top[s]=7 top[s]=6 Zadanie 4. Palindromy 2 Napisać program, który rozpoznaje palindromy, wykorzystując stos i operacje na stosie. K olejki reprezentują np. kolejki ludzi na poczcie, w banku lub sklepie, kolejka samochodów na skrzyżowaniu, itp. Operacja wstawiania do kolejki nazywana jestenqueue, a operacją usuwania elementu z kolejki jestdequeue. Kolejka posiada początek, head (głowę) oraz koniec tail (ogon). Element może być usunięty z kolejki jeśli tylko wtedy gdy znajduje się na jej początku. 5

Rysunek poniżej przedstawia implementację kolejki o maksymalnej liczbie elementów n 1 = 10 oraz działanie operacji Enqueue i Dequeue na tej kolejce. Tutaj przyjęto, że tablica reprezentująca kolejkę jest cykliczna, tzn. pozycja o numerze 1 jest następnikiem pozycji o numerze n. (a) (b) (c) 1 2 3 4 5 6 7 8 9 10 11 7 8 2 12xxxxxxxxxxxxxxxxxxxxx Q xxxxx 1 2 3 4 5 6 7 8 9 10 11 Q 7 2 12 6 1 9 5 4 1 2 3 4 5 6 7 8 9 10 11 Q 7 8 2 6 1 9 5 4 xxxxx xxxxx xxxxx 8 12 xxxxx head[q]=3 tail[q]=7 tail[q]=3 head[q]=5 tail[q]=3 head[q]=5 Algorytmy dodawania elementów do kolejki i usuwania elementów z kolejki przedstawiamy poniżej. Enqueue(Q,x) /* wstaw element x do kolejki */ 1 Q[tail[Q]] <- x 2 if tail[q]=length[q] 3 then tail[q] <- 1 4 else tail[q] <- tail[q]+1 Dequeue(Q) /* Usun element z kolejki */ 1 x <- Q[head[Q]] 2 if head[q]=length[q] 3 then head[q] <- 1 4 else head[q] <- head[q]+1 5 return Zadanie 5. Kolejki 3 Kolejka dwustronna (dwukierunkowa) jest strukturą danych pozwalającą na wstawianie i usuwanie elementów na obu jej końcach. Napisz cztery procedury, służące do wstawiania i usuwania elementów z obu końców kolejki przechowywanej w tablicy. Zadanie 6. Kolejki i stosy 2 Pokaż, jak zaimplementować kolejkę, używając dwóch stosów. Oszacuj czas działania operacji na takiej kolejce. Zadanie 7. Stosy i kolejki 2 Pokaż, jak zaimplementować stos za pomocą dwóch kolejek. Oszacuj czas działania operacji na takim stosie. L ista z dowiązaniami jest strukturą danych, w której elementy są ułożone w liniowym porządku. Porządek wyznaczają indeksy, wskazy, związane z każdym elementem listy. Lista posiada początek (head) i koniec (tail). Elementy listy mają swoje poprzedniki (prev, odprevious) oraz następniki (next). Często mamy doczynienia z listami posortowanymi. Operacje związane z listami to: wyszukiwanie, wstawianie elementów i usuwanie elementów. Elementy listy składają sie z pól zawierających wskazy do elementów poprzedniego i następnego. Jeśli takich elementów nie ma to wskaz zawiera wartość Nil. Oprócz pól zawierających wskazy, elementy listy zawierają pola zwane kluczami (key). Pola te mogą być dowolnego typu. 6

Mogą to być np. różnego rodzaju rekordy itp. Przykład bardzo prostej listy pokazany jest na rysunku. head prev next tail Nil 7 9 14 4 key (klucz) Nil List-Search(L,k) 1 x <- head[l] 2 while x <> Nil i key[x] <> k 3 do x <- next[x] 4 return List-Insert /* wstaw na poczatek listy L */ 1 next[x] <- head[l] 2 if head[l] <> Nil 3 then prev[head[l]] <- x 4 head[l] <- x 5 prev[x] <- Nil Algorytm ten pozwala wstawiać element x na początek listy. Następny algorytm usuwa element listy. W realizacji list za pomocą tablic wartość usuwanego elementu tablicy pozostaje niezmieniona. W ten sposób zaśmieca się pamięć (tablicę) reprezentującą listę. Podobnie dzieje się gdy korzystamy bezpośrednio z zasobów pamięci komputera używając wskazów. List-Delete(L,k) 1 if prev[x] <> Nil 2 then next[prev[x]] <- next[x] 3 else head[l] <- next[x] 4 if next[x] <> Nil 5 then prev[next[x]] <- prev[x] Jeśli udałoby się pominąć warunki brzegowe dotyczące głowy i ogona listy dwukierunkowej, wówczas treść procedury Delete byłaby prostsza. List-Delete(L, x) 1 next[prev[x]] <- next[x] 2 prev[next[x]] <- prev[x] Można to osiągnąć wprowadzając tzw. wartownika, który jest elementem NIL listy. Jeśli każdy wskażnik do Nil zamienimy wskaźnikiem do wartownika to lista staje się listą cykliczną. wartownik nil[l] 9 14 4 Zadanie 8. Listy 2 Napisać procedurę List-Search i List-Insert dla przypadku listy cyklicznej (z wartownikiem). 7

Zadanie 9. Sortowanie list 3 Napisać procedurę, która łączy dwie listy jednokierunkowe, posortowane w jedną listę posortowaną i jednokierunkową, bez używania wartowników. Następnie, zmodyfikować ją dodając wartownika o kluczu na koniec każdej z list. Porównać stopień komplikacji obu procedur. Zadanie 10. Odwracanie list 3 Napisać nierekurencyjną procedurę odwracającą kolejność elementów listy jednokierunkowej, działającą w czasie Θ(n). Dodatkowa pamięć (oprócz tej zajętej przez listę) powinna być stała (tj. niezależna od liczby elementów na liście). D rzewa binarne są w zasadzie połączonymi listami, w których każdy węzeł (ojciec) może zawierać wskazy do pary synów: lewego i prawego. Najwyższy węzeł nosi nazwę pnia (korzenia). Drzewa zawierające tylko węzeł główny noszą nazwą drzew o zerowej wysokości (czasami o jednostkowej). Każdy nowy poziom węzłów (znajdujących się na jednakowej wysokości) zwiększa wysokość drzewa o jeden. Drzewo całkowicie wypełnione posiada 2 wysokość drzewa węzłów. Drzewo poszukiwań binarnych (binary search tree, BST) jest drzewem o uporzadkowanych węzłach, przy czym, porządek węzłów zadany jest wg. jakiejś operacji binarnej lub boolowskiej. Najczęściej porządek jest następujący. Numer schodzącego węzła porównywany jest z numerem pnia i jeśli jest on mniejszy lub równy numerowi pnia to węzeł umieszczany jest z lewej jego strony. W przeciwnym wypadku węzeł umieszczany jest po prawej stronie pnia. Operacja powtarzana jest na każdym poziomie drzewa, aż do momentu gdy osiągnie się poziom ostatni gdzie umieszcza się ów węzeł. W ten sposób drzewo posiada strukturę logiczną. Istnieje kilka metod przechodzenia (przemiatania) drzewa binarnego. Są to metodapreorder, metodainorder oraz metodapostorder. Metodapreorder polega na wypisaniu klucza pnia drzewa w pierwszej kolejności, a następnie jego lewego poddrzewa. W następnym kroku przechodzi się do poddrzewa prawego. W każdym przypadku (lewego lub prawego poddrzewa) stosuje się również metodę preorder. W metodziepostorder wypisuje się klucz korzenia po wypisaniu wartości znajdujących się w poddrzewach: lewym i prawym. W metodzie przechodzenia drzewa zwanej inorder klucz korzenia wypisuje się pomiędzy kluczami z jego poddrzewa lewego i poddrzewa prawego. 5 4 7 3 5 8 2 3 nil 8

Zadanie 11. Skanowanie drzewa 3 Zaprojektuj algorytmy przechodzenia drzewa metodami inorder, postorder i preorder. Zadanie 12. Drzewa 2 Narysuj drzewa poszukiwań binarnych o wierzchołkach (węzłach) 1, 4, 5, 10, 16, 17, 21 o wysokościach 2, 3, 4, 5. P liki są strukturami danych które zawierają sekwencje elementów jednego typu. Dostęp do nich, w przeciwieństwie do tablic, jest sekwencyjny, tzn. element pliku jest dostępny gdy odpowiedni wskaz pokazuje ten element (patrz niżej). Przykład. Zadeklarujemy kilka typów plikowych. type PlikDanych: file of integer; PlikKolorow: file of (r, g, b); PlikZnakowy: file of char; Plik Tablic: file of array [1..10] of real; PlikPersonaliow: file of record Nazwisko: array [1..20] of char; RodzajZatrudnienia: (stałe, godzinowe, zlecone) end; { rekordu } var x: PlikDanych; y: PlikKolorow; z: PlikTablic; Spis: PlikPersonaliow; Podanie po zmiennej plikowej znaku ˆ pozwala wyłuskać wartość zmiennej z pliku (lub wstawić ją). Np. xôznacza liczbę całkowitą, yĵest jedną z wartości r, b lub g koloru. zĵest tablicą 10-o elementową. Pisząc zˆ[7] mamy dostęp do 7-go elementu tej tablicy. Pola rekordów z pliku Spis osiągalne są za pomocą konstrukcji: Spis^.Nazwisko[1]... Spis^.Nazwisko[20] Spis^.RodzajZatrudnienia Funkcje związane z plikami(file) Z typami danych deklarowanych z pomocą fileof wiążą się funkcje operujące na tych strukturach. Są to eof(plik) boolean, = true jeśli jest koniec struktury plik; reset(plik) ustawia wskaz do pierwszego elementu struktury plik; pozwala czytać plik; rewrite(plik) ustawia plik do zapisu; eof(plik)=true; get(plik) przesuwa wskaz do następnego elementu pliku i pobiera ten element;... put(plik) dopisuje do pliku odpowiadający element Plikitekstowe. W językupascal (w innych językach jest podobnie) istnieje specjalny typ predefiniowany, który zawiera znaki. Jest to typtext. Plik ten składa się z linii tekstu (line) oddzielonych znakiem nowej linii (W systemach Unix: new line; w systemach Dos, Win9x: new line +carriagereturn). Linie składają się ze znaków (char). 9

Z plikami tekstowymi związane są następujące operacje (zmienna plik jest typu text, zmienna znak jest typu char): eoln(plik) boolean; =true jeśli koniec linii read(plik, znak) czytanie znaku; readln(plik, znak) z:=plik^; while not eoln(plik) do get(plik); get(plik); write(plik, z) plikˆ:=z; put(plik); writeln(plik,z) z:=plik^; put(plik); plik^:="znl"; put(plik); Tutaj znl jest znakiem nowej linii. 10