Praktikum 7 - kodu.ut.eekodu.ut.ee/~kiho/ads/fall14/Slaidid/Slaidid_pr7.pdfKahendpuu valmistamine ja...

17
Praktikum 7 Kahendpuud Algoritmid ja andmestruktuurid 2014/2015 sügissemester [email protected] www.cs.ut.ee/~kiho/ads/fall14/ Abivahendid kahendpuu loomiseks, kuvamiseks ja töötlemiseks Kahendpuu valmistamine ja kuvamine Harjutusülesanded KP_1. Täieliku kahendpuu valmistamine KP_2. Kahendpuu kõrgus KP_3. Tasakaalu kontrollimine KP_4. Kahendpuu ja puu läbimine KP_5. Aritmeetilise avaldise puu KP_6. Tipu järglaste koguarv KP_7. Tippudele kõrguse- ja tasemeväljad KP_8. Tasemete generaator KP_9. Kompaktse kahendpuu valmistamine KP_10. Kahendpuu peegeldus

Transcript of Praktikum 7 - kodu.ut.eekodu.ut.ee/~kiho/ads/fall14/Slaidid/Slaidid_pr7.pdfKahendpuu valmistamine ja...

Praktikum 7Kahendpuud

Algoritmid ja andmestruktuurid

2014/2015 sügissemester

[email protected]

www.cs.ut.ee/~kiho/ads/fall14/

• Abivahendid kahendpuu loomiseks, kuvamiseks ja • töötlemiseks• Kahendpuu valmistamine ja kuvamine• Harjutusülesanded

KP_1. Täieliku kahendpuu valmistamineKP_2. Kahendpuu kõrgusKP_3. Tasakaalu kontrollimineKP_4. Kahendpuu ja puu läbimineKP_5. Aritmeetilise avaldise puuKP_6. Tipu järglaste koguarvKP_7. Tippudele kõrguse- ja tasemeväljadKP_8. Tasemete generaatorKP_9. Kompaktse kahendpuu valmistamineKP_10. Kahendpuu peegeldus

Abivahendid kahendpuu loomiseks, kuvamiseks ja töötlemiseks

Moodul Graaf.py

sisaldab klasside Tipp, Kaar ja Graaf kirjeldusi.

Kahendpuud käsitletakse kui graafi erijuhtu. Seetõttu on rakendatavad

graafitöötlemise funktsioonid klassist Graaf. Viimane sisaldab ka mõningaid

erifunktsioone just kahendpuu jaoks. Kahendpuu juureks on graafi esimene tipp

(tipp indeksiga 0).

Käivitatav Java-programm SebiKPuud.jar

Kahendpuu valmistamine ja kuvamine

Python

import os

os.system("java -jar SebiKPuud.jar -juhu 7 xxx.txt")

-- on loodud 7-tipuline juhu-kahendpuu ja see salvestatud faili xxx.txt (tabelkujul)

-- ühtlasi näidatakse seda kahendpuud ekraanil (kuvatakse see kahendpuu)

kp = graafFailist("xxx.txt")

-- vastavalt failis xxx.txt olevale tabelile loodud klassi Graaf isend kp

-- kp töötlemine (muutmine), näiteks:kp.tipud[0].seadaMärgend("00")

-- kp juure märgendiks seatud “00” (graafi g tippude list on g.tipud)

…kp.faili("yyy.txt")

-- kp salvestatud faili yyy.txt (tabelkujul)os.system("java -jar SebiKPuud.jar yyy.txt")

-- kuvatakse kahendpuu failist yyy.txt

Harjutusülesanded

KP_1. Täieliku kahendpuu valmistamine [Kiho 2003, lk 28]

Kirjutada ja testida rekursiivne funktsioon järgmise ülesande lahendamiseks.

Antud: arv m – loodava kahendpuu tasemete arv.

Tulemus: täielik m-tasemeline kahendpuu.

Python

Ühetipulise (ainult juur) kahendpuu kp tegemine:kp = Graaf() -- tühi graaf

juur = Tipp() -- uus tühi tipp

juur.nimi = "[0;0]“ -- juure x := 0, juure y := 0

kp.lisadaTipp(juur)

Kahendpuu tegemisel määratakse tipukoordinaadid (x; y) ainult juurtipule.

Kahendpuus kp alluvateta tipule t mõlema alluva lisamine:uus = Tipp() -- tühi tipp (ka koordinaatideta)

kp.lisadaAlluv(t, uus, True) -- True: lisamine vasakuks alluvaks

uus = Tipp()

kp.lisadaAlluv(t, uus, False) -- False: lisamine paremaks alluvaks

Ehk lühemalt:kp.lisadaAlluv(t, Tipp(), True)

kp.lisadaAlluv(t, Tipp(), False)

KP_2. Kahendpuu kõrgus

Kirjutada ja testida rekursiivne funktsioon järgmise ülesande lahendamiseks.

Antud: kahendpuu ja selle tipp.

Tulemus: antud tipust algava (alam)kahendpuu kõrgus.

Alampuu

juur kõrgus

A 4

B 3

C 2

D 2

E 1

F 1

G 1

Testi tulemuse näide

KP_3. Tasakaalu kontrollimine

Koostada programm järgmise ülesande lahendamiseks.

Antud: kahendpuu.

Tulemus: nende tippude järjend (listina), kus tasakaal on rikutud,

st tipu alluvate kõrgus erineb rohkem kui 1 võrra.

Tasakaal rikutud

tipus B

tipus C

On tasakaalus.

Testi tulemuse näited

KP_4-1. Kahendpuu läbimine [Kiho 2003, lk 29]

Kirjutada ja testida rekursiivsed funktsioonid järgmiste ülesannete lahendamiseks

Antud: kahendpuu ja selle tipp t.

Tulemus: tipust t algava kahendpuu tipud/tipumärgendid eesjärjestuses (listina).

Antud: kahendpuu ja selle tipp t.

Tulemus: tipust t algava kahendpuu tipud/tipumärgendid keskjärjestuses (listina).

Antud: kahendpuu ja selle tipp t.

Tulemus: tipust t algava kahendpuu tipud/tipumärgendid lõppjärjestuses (listina).

KP_4. Kahendpuu ja puu läbimine

Pythondef eesjrst(kp, t, m=False):

# Antud: kahendpuu kp ja tipp t selles ning tunnus m

# Tulemus: tagastatakse eesjärjestuses (listina)

# tipust t algava kahendpuu

# tipumärgendid, kui m = True

# tipud, kui m = False

KP_4-2. Puu läbimine

Kirjutada ja testida rekursiivsed funktsioonid järgmiste ülesannete lahendamiseks.

Antud: puu ja selle tipp t..

Tulemus: tipust t algava (alam)puu tipud eesjärjestuses (listina).

Antud: puu ja selle tipp t.

Tulemus: tipust t algava (alam)puu tipud lõppjärjestuses (listina).

Puu eesjrst:

A B C D E F G L K H

Puu loppjrst:

D C F L G K E H B A

Testi tulemuse näide

Puu väljastatud käsugaos.system("java –jar SebiPuud xxx.txt")

KP_5. Aritmeetilise avaldise puu

Koostada programm, mis valmistab (juhusliku) aritmeetilise avaldise kahendpuu

ja arvutab vastava avaldise väärtuse. (Vt ka järgmine slaid.)

Eraldi funktsioonidena kirjeldada järgmised alamülesanded:

KP_5-1. Aritmeetilise avaldise puu valmistamine

Kirjutada ja testida funktsioon järgmise ülesande lahendamiseks.

Antud: kahendpuu.

Tulemus: antud kahendpuu muudetud 0-2 kahendpuuks (igale ühe alluvaga tipule

lisatud teine, puudunud alluv), seejärel

rippuvate tippude märgenditeks seatud juhuarvud,

ülejäänutele – binaarsete tehete märgid, juhuvalik (+ - * /) seast.

KP_5-2. Kahendpuu sulustatud tipumärgendid keskjärjestuses

Kirjutada ja testida rekursiivne funktsioon järgmise ülesande lahendamiseks.

Antud: kahendpuu ja selle tipp t.

Tulemus: tipust t algava kahendpuu tippude märgendid keskjärjestuses listina,

mille esimeseks liikmeks on lisatud veel avav sulg ‘(‘ ja viimaseks sulgev sulg ‘)’.

Valmistada juhu-kahendpuu

Teisendada see 0-2 kahendpuuks ja seada tipumärgendid (KP_5-1)

Teha tipumärgendite (sulustatud) list (KP_5-2)

Evalueerida vastav sõne.

Programmi

KP_5

üldskeem:

L = ['(', '(', '9', ')', '/', '(', '(', '(', '0', ')', '-', '(', '5', ')', ')', '/','(', '-5', ')', ')', ')']selle listi esitus sõnena: ‘‘.join(L) = “((9)/(((0)-(5))/(-5)))”

Avaldise väärtuseks on eval("((9)/(((0)-(5))/(-5)))") = 9

Aritmeetilise avaldise kahendpuu (KOP_5-1 testi tulemuse) näide:

KOP_5-2 tulemus L selle kahendpuu korral (juurest alates):

KP_6. Tipu järglaste koguarv

Kirjutada ja testida rekursiivne funktsioon järgmise ülesande lahendamiseks.

Antud: kahendpuu ja selle tipp.

Tulemus: antud tipu kõigi (vahetute ja kaugemate) järglaste koguarv

Tipp Järglasi

A 6

B 4

C 0

D 2

E 0

F 0

G 0

Testi tulemuse näide

KP_7. Tippudele kõrguse- ja tasemeväljad

KP_7-1. Kirjutada ja testida rekursiivne funktsioon järgmise ülesande lahendamiseks.

Antud: kahendpuu kp, selle tipp t.

Tulemus: tipust t algavas kp alampuus on iga tipu u väljale "h" omistatud tipust u algava

alampuu kõrgus; funktsiooni väärtuseks saab tipust t algava alampuu kõrgus.

Testi tulemuse näideTipuväljadega täiendatud kahendpuu väljastatud käsugaos.system("java –jar SebiGraafi yyy.txt")

KP_7-2. Kirjutada ja testida rekursiivne funktsioon järgmise ülesande lahendamiseks.

Antud: kahendpuu kp, selle tipp t ja tipu t tasemenumber m.

Tulemus: tipust t algavas kp alampuus on iga tipu väljale "tase" omistatud

tasemenumber; antud tipu tasemenumbriks on m, selle alluvatel m+1 jne.

Testi tulemuse näideTipuväljadega täiendatud kahendpuu väljastatud käsugaos.system("java –jar SebiGraafi yyy.txt")

Tipumärgendid

tasemeti:

A

B C

D E J

F I N O

G L K

H M P

Q

KP_8. Tasemete generaator

Kirjutada ja testida generaator-funktsioon järgmise ülesande lahendamiseks.

Antud: kahendpuu.

Tulemus: antakse välja järjekordse taseme tipud (listina).

Testi tulemuse näide

KP_9. Kompaktse kahendpuu valmistamine [Kiho 2003, lk 28]

Kirjutada ja testida funktsioon järgmise ülesande lahendamiseks.

Antud: arv n – loodava kahendpuu tippude arv.

Tulemus: kompaktne n-tipuline kahendpuu.

Programmi

KP_9

üldskeem:

KP_10. Kahendpuu peegeldus

Kirjutada ja testida funktsioon järgmise ülesande lahendamiseks.

Antud: kahendpuu.

Tulemus: antud kahendpuu peegeldus üle vertikaaltelje.

Idee: tippude x-koordinaadid asendada vastandarvudega.

Testi tulemuse näide