Algoritmusok 4
- Algoritmus: PREORD(INFO, LEFT, RIGHT, ROOT). Az algoritmus az irányítással
megegyező sorrendben bejárja a memóriában lévő T bináris fát, miközben a fa
csomópontjaira a PROCESS-szel jelölt műveleteket alkalmazza. A STACK tömb
ideiglenesen tárolja a csomópontok címét.
- [Kiindulásként a NULL ráhelyezése a STACK-re és a PTR inicializálása.]
TOP:=1, STACK[1]:=NULL, PTR:=ROOT.
- Repeat 3. to 5. lépés while PTR . NULL:
- A PROCESS alkalmazása az INFO[PTR] csomópontra.
- [Van-e jobb oldali "gyermek"?]
If RIGHT[PTR] . NULL, then: [Ráhelyezés a STACK-re.]
TOP:=TOP+1, STACK[TOP]:=RIGHT[PTR].
[Az If szerkezet vége.]
- [Van-e bal oldali "gyermek"?]
If LEFT[PTR] . NULL, then:
PTR:=LEFT[PTR].
Else: [Leemelés a STACK-ről.]
PTR:=STACK[TOP], TOP:=TOP-1.
[Az If szerkezet vége.]
[A 2. lépésben elkezdődött ciklus vége.]
- Exit.
- Algoritmus: INORD(INFO, LEFT, RIGHT, ROOT). Az algoritmus - szimmetrikus
sorrendben - bejárja a memóriában lévő T bináris fát, miközben a szóban forgó fa
csomópontjaira a PROCESS-szel jelölt műveletet alkalmazza. A STACK tömb
ideiglenesen tárolja a csomópontok címét.
- [Kiindulásként a NULL ráhelyezése a STACK-re és a PTR inicializálása.]
TOP:=1, STACK[1]:=NULL, PTR = ROOT.
- Repeat while PTR . NULL: [A bal szélső útvonal ráhelyezése a STACK-re.]
- TOP:=TOP+1, STACK[TOP]:=PTR. [A csomópont elmentése.]
- PTR:=LEFT[PTR]. [A PTR aktualizálása.]
[A ciklus vége.]
- PTR:=STACK[TOP], TOP:=TOP-1. [A csomópont leemelése a veremről.]
- Repeat 5. to 7. lépés while PTR . NULL:
[Visszalépés.]
- A PROCESS alkalmazása az INFO[PTR] csomópontra.
- [Van-e jobboldali "gyermek"?]
If RIGHT[PTR] . NULL, then:
- PTR:=RIGHT[PTR].
- Go to 3. lépés.
[Az If szerkezet vége.]
- PTR:=STACK[TOP], TOP:=TOP-1. [A csomópont leemelése a veremről.]
[A 4. lépésben elkezdődött ciklus vége.]
- Exit.
- Algoritmus: POSTORD(INFO, LEFT, RIGHT, ROOT). Az algoritmus az irányítással
ellenkező sorrendben bejárja a memóriában lévő T bináris fát, miközben a
csomópontjaira a PROCESS-szel jelölt műveletet alkalmazza. A STACK tömb
ideiglenesen tárolja a csomópontok címét.
- [Kiindulásként a NULL ráhelyezése a STACK-re és a PTR inicializálása.]
TOP:=1, STACK[1]:=NULL, PTR:=ROOT.
- [A bal szélső útvonal ráhelyezése a STACK-re.]
Repeat 3. to 5. lépés while PTR . NULL:
- TOP:=TOP+1, STACK[TOP]:=PTR.
[A PTR ráhelyezése a STACK-re.]
- If RIGHT[PTR] . NULL, then: [Ráhelyezés a STACK-re.]
TOP:=TOP+1, STACK[TOP]:=-RIGHT[PTR]
[Az If szerkezet vége.]
- PTR:=LEFT[PTR]. [A PTR mutató aktualizálása.]
[A 2. lépésben elkezdődött ciklus vége.]
- PTR:=STACK[TOP], TOP:=TOP-1.
[A csomópont leemelése a STACK-ről.]
- Repeat while PTR>0:
- A PROCESS alkalmazása az INFO[PTR] csomópontra.
- PTR:=STACK[TOP], TOP:=TOP-1.
[A csomópont leemelése a STACK-ről.]
[A ciklus vége.]
- If PTR<0, then:
- PTR:=-PTR.
- Go to 2. lépés.
[Az If szerkezet vége.]
- Exit.
- Eljárás: FIND(INFO, LEFT, RIGHT, ROOT, ITEM, LOC, PAR). Legyen adott a T
bináris, rendezett fa a memóriában, valamint az ITEM információ. Az eljárás a T
fában megkeresi az ITEM helyét (LOC), valamint az ITEM szülőjének helyét (PAR).
Három különleges eset létezik:
- A LOC . NULL és a PAR = NULL azt jelzi, hogy üres a fa;
- A LOC . NULL és a PAR = NULL azt jelzi, hogy az ITEM a T
gyökerében helyezkedik el;
- A LOC = NULL és a PAR . NULL azt jelzi, hogy az ITEM
nem fordul elő a T-ben, ezért - a PAR helyen lévő N csomópont
gyermekeként - hozzá kell kapcsolni a T-hez.
- [Üres fa?]
If ROOT = NULL, then LOC:=NULL, PAR:=NULL, Return.
- [Az ITEM a gyökérben van?]
If ITEM=INFO[ROOT], then LOC:=ROOT, PAR:=NULL, Return.
- [A PTR és a SAVE mutató inicializálása.]
If ITEMPTR:=LEFT[ROOT], SAVE:=ROOT.
Else:
PTR:=RIGHT[ROOT], SAVE:=ROOT.
[Az If szerkezet vége.]
- Repeat 5. and 6. lépés while PTR. NULL:
- [Megvan az ITEM tétel?]
If ITEM=INFO[PTR], then LOC:=PTR, PAR:=SAVE, Return.
- If ITEMSAVE:=PTR, PTR:=LEFT[PTR].
Else:
SAVE:=PTR, PTR:=RIGHT[PTR].
[Az If szerkezet vége.]
[A 4. lépésben elkezdődött ciklus vége.]
- [Sikertelen keresés.] LOC:=NULL, PAR:=SAVE.
- Return.
- Algoritmus: INSBST(INFO, LEFT, RIGHT, ROOT, AVAIL, ITEM, LOC). Legyen
adott a memóriában a T bináris, rendezett fa, valamint az ITEM információ! Az
algoritmus megkeresi a T-ben az ITEM tétel LOC helyét, vagy az ITEM tételt - új
csomópontként - beszúrja a T fa LOC helyére.
- Call FIND(INFO,LEFT, RIGHT, ROOT, ITEM, LOC, PAR).
[A IV. eljárás.]
- If LOC . NULL, then Exit.
- [Az ITEM bemásolása az AVAIL lista első szabad csomópontjába.]
- If AVAIL=NULL, then: Write: TÚLCSORDULÁS, Exit.
- NEW:=AVAIL, AVAIL:=LEFT[AVAIL], INFO[NEW]:=ITEM.
- LOC:=NEW, LEFT[NEW]:=NULL, RIGHT[NEW]:=NULL.
- [Az ITEM beszúrása a fába.]
If PAR=NULL, then_
ROOT:=NEW.
Else if ITEMLEFT[PAR]:=NEW.
Else:
RIGHT[PAR]:=NEW.
[Az If szerkezet vége.]
- Exit.
- Eljárás: CASE(INFO, LEFT, RIGHT, ROOT, LOC, PAR). Az eljárás törli a LOC
helyen lévő N csomópontot, ha az N csomópontnak nulla vagy egy gyermeke van. A
PAR mutató megadja az N-hez tartozó szülő csomópont helyét, vagy jelzi - a
PAR=NULL feltétellel -, hogy az N a gyökércsomópont. A CHILD mutató megadja
az N csomópont gyermekének helyét, vagy jelzi - a CHILD=NULL feltétellel - hogy
az N-nek nincs gyermeke.
- [A CHILD mutató inicializálása.]
If LEFT[LOC]=NULL and RIGHT[LOC]=NULL, then:
CHILD:=NULL.
Else if LEFT[LOC].NULL, then:
CHILD:=LEFT[LOC].
Else:
CHILD:=RIGHT[LOC].
[Az If szerkezet vége.]
- If PAR.NULL, then:
If LOC=LEFT[PAR], then:
LEFT[PAR]:=CHILD.
Else:
RIGHT[PAR]:=CHILD.
Else:
ROOT:=CHILD.
[Az If szerkezet vége.]
- Return.
- Eljárás: CASEB(INFO, LEFT, RIGHT, ROOT, LOC, PAR). Az eljárás törli a LOC
helyen lévő N csomópontot, ha az N csomópontnak két gyermeke van. A PAR mutató
megadja az N-hez tartozó szülő csomópont helyét, vagy jelzi - a PAR=NULL
feltétellel -, hogy az N gyökércsomópont. A SUC mutató megadja az N-et
szimmetrikus sorrendben követő elem helyét, a PARSUC pedig tárolja az N-et
szimmetrikus sorrendbe követő elem szülőjének helyét.
- [A SUC és a PARSUC elem megkeresése.]
- PTR:=RIGHT[LOC], SAVE:=LOC.
- Repeat while LEFT[PTR] . NULL:
SAVE:=PTR, PTR:=LEFT[PTR].
[A ciklus vége.]
- SUC:=PTR, PARSUC:=SAVE.
- [A szimmetrikus sorrend szerint következő elem törlése a VI. Eljárás
segítségével.]
Call CASEA(INFO, LEFT, RIGHT, ROOT, SUC, PARSUC).
- [Az N csomópont felcserélése az N-et szimmetrikusan követő elemmel.]
- If PAR.NULL, then:
If LOC=LEFT[PAR], then:
LEFT[PAR]:=SUC.
Else:
RIGHT[PAR]:=SUC.
[Az If szerkezet vége.]
Else:
ROOT:=SUC.
[Az If szerkezet vége.]
- LEFT[SUC]:=LEFT[LOC], RIGHT[SUC]:=RIGHT[LOC].
- Return.
- Algoritmus: DEL(INFO, LEFT, RIGHT, ROOT, AVAIL, ITEM). Legyen adott a T
bináris, rendezett fa a memóriában, valamint az ITEM információ! Az algoritmus törli
a fából az ITEM-et tartalmazó csomópontot.
- [Az ITEM információt tartalmazó csomópont és a hozzá tartozó szülő
helyének megkeresése a IV. eljárás segítségével.]
Call FIND(INFO, LEFT, RIGHT, ROOT, ITEM, LOC, PAR).
- [Az ITEM szerepel a fában?]
If LOC=NULL, then Write: az ITEM nem szerepel a fában.
Exit.
- [Az ITEM-et tartalmazó csomópont törlése.]
If RIGHT[LOC].NULL and LEFT[LOC].NULL, then:
Call CASEB(INFO, LEFT, RIGHT, ROOT, LOC, PAR).
Else:
Call CASEA(INFO, LEFT, RIGHT, ROOT, LOC, PAR).
[Az If szerkezet vége.]
- [A törölt csomópont visszakapcsolása az AVAIL listába.]
LEFT[LOC]:=AVAIL, AVAIL:=LOC.
- Exit.
- Eljárás: INSHEAP(TREE, N, ITEM]. Legyen adott az N elemet tartalmazó H halom -
ezt a TREE tömb tárolja -, valamint az ITEM információ! Az eljárás az ITEM-et
beszúrja a H halomba. A PTR az éppen aktuális helyet tárolja az ITEM léptetése
közben, a PAR pedig az ITEM szülőjének helyét.
- [Az új csomópont hozzákapcsolása a fához és a PTR inicializálása.]
N:=N+1, PTR:=N.
- [Az ITEM helyének megkeresése.]
Repeat 3. to 6. lépés while PTR>1.
- Set PAR:=[PTR/2] [A szülő csomópont helye.]
- If ITEM<=TREE[PAR], then:
TREE[PTR]:=ITEM, Return.
[Az If szerkezet vége.]
- TREE[PTR]:=TREE[PAR]. [A csomópont lefelé léptetése.]
- PTR:=PAR. [A PTR aktualizálása.]
[A 2. lépésben elkezdődött ciklus vége.]
- [Az ITEM beállítása a H gyökerére.]
TREE[1]:=ITEM.
- Return.
- Eljárás: DELHEAP(TREE, N, ITEM). Az N elemű H halmot a TREE tömb tárolja.
Az eljárás a H halom TREE[1] gyökerét hozzárendeli az ITEM változóhoz, és a
megmaradó elemekből újból felépíti a halmot. A LAST változó a H eredetileg utolsó
csomópontjának értékét tárolja. A PTR, a LEFT és a RIGHT mutató megadja a LAST,
valamint a LAST-hoz tartozó jobb és bal oldali gyermekek helyét (a LAST közben
egyre lejjebb kerül a fában).
- ITEM:=TREE[1]. [A H gyökerének eltávolítása.]
- LAST:=TREE[N], N:=N-1. [A H utolsó csomópontjának eltávolítása.]
- PTR:=1, LEFT:=2, RIGHT:=3. [A mutatók inicializálása.]
- Repeat 5. to 7. lépés while RIGHT<=N:
- If LAST>=TREE[LEFT] and LAST>=TREE[RIGHT], then:
TREE[PTR]:=LAST, Return.
[Az If szerkezet vége.]
- If TREE[RIGHT]<=TREE[LEFT], then:
TREE[PTR]:=TREE[LEFT], PTR:=LEFT.
Else:
TREE[PTR]:=TREE[RIGHT], PTR:=RIGHT.
[Az If szerkezet vége.]
- LEFT:=2*PTR, RIGHT:=LEFT+1.
[A 4. lépésben elkezdődött ciklus vége.]
- If LEFT=N and LAST
- TREE[PTR]:=LAST.
- Return.
- Algoritmus: HEAPSORT(A, N). Legyen adott az N elemet tartalmazó A tömb. Az
algoritmus rendezi az A tömb elemeit.
- [A H halom felépítése a IX. eljárás segítségével.]
Repeat for J=1 to N-1:
Call INSHEAP(A, J, A[J+1]).
[A ciklus vége.]
- [Az A rendezése a H gyökerének ismételt törlésével, amire a X. algoritmust
használjuk.]
Repeat while N>1:
- Call DELHEAP(A, N, ITEM).
- A[N+1]:=ITEM.
- Exit.
Egy szintet vissza, vagy
vissza a főmenübe.