Metody Programowania - Lista 5


Zadanie 1

Węzły drzewa binarnego są listami czteroelemetowymi, których pierwsze pole służy jako klucz zaś ostatnie (czwarte) to wartość związana z węzłem. Napisać funkcję (5 różnych) która:

Zadanie 2

Napisać funkcję która mając dane drzewo, takie jak w zadaniu 1 i funkcję jednoargumentową f "przejdzie" po drzewie i zaaplikuje funkcję f do każdego węzła drzewa.

Zadanie 3

Mamy drzewo binarne takie jak w zadaniu 1 (którego węzły mają pole przechowujące wartość). Napisać funkcję której ma dwa argumenty: drzewo d i funkcję jednoargumentową f. Funkcja ta ma wyprodukować nowe drzewo, będące przekształceniem starego. Dokładniej, ma ona zamienić miejscami lewe poddrzewo z prawym, o ile wywołanie funkcji f (z argumentem będącym wartością węzła) do wartość prawdziwą. W przeciwnym razie kolejność węzłów pozostawia się bez zmian. Funkcja ma wykonać tylko jedno przejście po drzewie i nie ma zmieniać oryginalnego drzewa.

Zadanie 4

Napisać funkcję która upraszcza (częściowo "spłaszcza") drzewa. Dokładniej, jeśli dany wezeł drzewa jest reprezentowany przez listę jednoelementową ma być on zastąpiony przez jedyny element tej listy.

Zadanie 5

Napisać funkcję która "spłaszcza" wyrażenia arytmetyczne, tzn. zastępuje dwuargumentowe operatory dodawania i mnożenia wersją wieloargumentową (gdy można, tzn. jeśli argumentem sumy jest suma lub argumentem iloczynu jest iloczyn).

Zadanie 6

Zakładamy że wyrażenia logiczne są reprezentowane tak jak w zadaniu 3 z Listy 4. Napisać funkcję która mając dane wyrażenie, wartość logiczną (true lub false) i listę wartości (niektórych) zmiennych wyprodukuje nowe wyrażenie w którym ta zmienne jest zastąpione są przez podane wartości. Przy tym funkcja ta ma wykonywać "oczywiste" uproszczenia, tzn. usuwać wartość false z sumy logicznej, usuwać wartość true z iloczynu logicznego, zastępować sumę logiczną której jednym składnikiem jest true przez true, zastępować iloczyn logiczny którego czynnikiem jest false przez false. Zastanowić się jakie dodatkowe uproszczenia warto by zrobić.

Zadanie 7

Napisać funkcję "upraszczającą" wyrażenia arytmetyczne (reprezentowane przez drzewa). Funkcja ta powinna pomijać dodawanie 0 i mnożenie przez 1 oraz wykonać działania których argumentami są liczby.

Zadanie 8

Napisać funkcję która mając dane drzewo takie jak w zadaniu 1 przekształci je tak że węzły będą reprezentowane przez czteroelementowe wektory.

Zadanie 9

Zakładamy że elementy drzewa i listy mają deklaracje jak niżej:
struct drzewo {
    struct drzewo * lewe;
    struct drzewo * prawe;
    int klucz;
    int wartosc;
};
struct lista {
    struct lista * nastepny;
    int klucz;
    int wartosc;
};
Napisać funkcję która mając dane drzewo uporządkowane `d' i wartości `k1' i `k2' wyprodukuje listę tych kluczy (i odpowiadająch im wartości) które są większe lub równe `k1' i mniejsze lub równe `k2'. Innmi słowy ma to być lista kluczy (i odpowiadająch im wartości) z odcinka domkniętego od `k1' do `k2'. Uwaga: funkcja ma wykonywać co najwyżej `O(w+m)' operacji gdzie `w' jest wysokością drzewa zaś `m' jest ilością elementów wynikowej listy.