Puurakenteet

Transcription

Puurakenteet
Tietorakenteet ja algoritmit
Puurakenteet
Ari Korhonen
13.10.2015
Tietorakenteet ja algoritmit
1
7. PUURAKENTEET
7.1 Käsitteistöä
7.2 Binääripuu (binary tree)
7.3 Puiden esitys- ja toteutustapoja
7.4 Puussa kulkeminen (traversing a tree)
7.5 Puiden sovelluksia
13.10.2015
Tietorakenteet ja algoritmit
2
7.1
§ 
Käsitteistöä
Puurakenteen perusmalli on sukupuu
ylös
A
juuri (root)
alas
B
D
13.10.2015
C
H
G
L
Tietorakenteet ja algoritmit
isä (parent)
lapsi (child)
3
Käsitteitä ja ominaisuuksia:
§ 
Solmu (node, vertex) on puuhun kuuluva alkio, johon voidaan
tallettaa tietoa
§ 
Särmä, kaari (edge, arc) on suora yhteys kahden solmun välillä
§ 
Juuri (root) on puun ylin solmu
§ 
Solmun lähin edeltäjä on sen isä (father, dad, parent). Kauemmista
edeltäjistä käytetään nimeä isoisä, esi-isä tai edeltäjä (grandfather,
ancestor)
§ 
Solmun lähinnä alemmat seuraajat ovat sen lapsia (children).
Näiden lapset vastaavasti lapsenlapsia (grandchildren)
§ 
Kullakin solmulla on vain yksi isä
§ 
ylös
juuri (root)
alas
Juurella ei ole isää
B
D
13.10.2015
A
Tietorakenteet ja algoritmit
C
H
G
L
isä (parent)
lapsi (child)
4
§ 
Solmulla voi olla 0-N kpl lapsia. Yleisessä puussa lasten määrää ei
ole rajoitettu
§ 
Saman isän lapset ovat toistensa sisaruksia (sibling)
§ 
Lehti (leaf, external node) on solmu, jolla ei ole lapsia
§ 
Muut solmut ovat puun sisäsolmuja (internal node)
§ 
Lehdet ovat joskus rakenteeltaan erilaisia kuin sisäsolmut
§ 
Polku (path) on yhteys kahden solmun välillä
§ 
Juuresta mihin tahansa solmuun on vain yksi polku. Vastaavasti
jokaisesta solmusta on vain yksi polku mihin tahansa toiseen
solmuun. Puussa ei ole silmukoita.
§ 
Jokainen solmu on oman alipuunsa
(subtree) juuri
§ 
13.10.2015
Puiden joukko on metsä (forest)
Tietorakenteet ja algoritmit
ylös
A
juuri (root)
alas
B
D
C
H
G
L
isä (parent)
lapsi (child)
5
§ 
Järjestetyssä puussa (ordered tree) lasten järjestys on määrätty
• 
Vasen, Oikea
• 
Ensimmäinen, Toinen,...,Viimeinen
• 
Järjestys liittyy puun rakenteeseen. Se EI tarkoita sitä että
solmuihin liittyvä tieto olisi järjestyksessä!
§ 
Solmu on tasolla N (level N), jos polulla siitä juureen on N solmua.
Juuren taso on 0.
§ 
Puun korkeus (height) on sen tasojen määrä, ts. pisimmän
juuresta lehteen ulottuvan polun pituus
ylös
A
juuri (root)
alas
B
D
13.10.2015
Tietorakenteet ja algoritmit
C
H
G
L
isä (parent)
lapsi (child)
6
Lause: Jos puussa on N solmua niin siinä on N-1 särmää
Todistus:
§ 
Jokainen solmu kytkeytyy yhdellä särmällä isäsolmuunsa
§ 
Juurisolmulla ei ole isää
Puun rekursiivinen määritelmä:
§ 
Puu on joko yksittäinen solmu tai juurisolmu, joka on kytketty
joukkoon muita puita (= alipuita )
ylös
§ 
Alipuiden tulee olla pareittain pistevieraita
A
alas
B
D
13.10.2015
Tietorakenteet ja algoritmit
juuri (root)
C
H
G
L
isä (parent)
lapsi (child)
7
§ 
Usein käytetty merkintä:
• 
Solmut palloja
• 
Alipuut kolmioita
P
U
U
K4.2
A l i puu
A l i puu
13.10.2015
Tietorakenteet ja algoritmit
8
7.2
§ 
§ 
§ 
13.10.2015
Binääripuu (binary tree)
Hyvin tärkeä puiden perustyyppi.
Binääripuu (binary tree) on järjestetty puu, jossa jokaisella solmulla
on täsmälleen kaksi lasta: vasen ja oikea (voivat olla tyhjiä)
Binääripuu on täydellinen (complete), jos alinta tasoa
lukuunottamatta kaikki tasot ovat täynnä ja alimmalla tasolla solmut
ovat vasemmassa reunassa
Tietorakenteet ja algoritmit
9
7.3 Puiden esitys- ja toteutustapoja
7.3.1
Dynaaminen tietorakenne
struct node {
char key;
struct node *left;
struct node *right;
};
key
left
right
typedef struct node * link;
§ 
13.10.2015
Lehtisolmujen linkit voidaan asettaa arvoon NULL,
joskin erillisen Z-solmun käyttö on parempi ratkaisu
Tietorakenteet ja algoritmit
10
Sama Javalla
class TreeNode
{
private Object data;
private TreeNode left, right;
TreeNode (Object element)
{
data = element;
left = null;
right = null;
}
}
TreeNode root, p, q;
13.10.2015
Tietorakenteet ja algoritmit
11
§ 
Joskus juuren käsittely joudutaan suorittamaan erikoistapauksena
• 
§ 
Esim. jos kaikkiin solmuihin kohdistettava operaatio viittaa myös
solmun isään
Kannattaa määritellä ylimääräinen Head-solmu, josta on viittaus
juureen
• 
Vrt. linkitetty lista
H ea d
K4.4
13.10.2015
Tietorakenteet ja algoritmit
12
§ 
Samoin voidaan määritellä erityinen z-solmu, johon tyhjät alipuut eli
lehtisolmujen linkit viittaavat (Sedgewick: Algorithms) :
H ea d
• 
z-solmuja on vain yksi
kappale
• 
z-solmun linkit viittaavat
z-solmuun itseensä
• 
K4.5
Kaikki kerralla käytössä
olevat dynaamiset
tietorakenteet voivat
käyttää samaa z-solmua
Z
13.10.2015
Tietorakenteet ja algoritmit
13
§ 
Nyt esim voidaan luoda tyhjä puu ja käsitellä sitä samoilla rutiineilla
kuin muitakin puita:
link Z = malloc(sizeof(struct node));
Z->left = Z;
Z->right = Z;
H ea d
link Head =
malloc(sizeof(struct node));
Head->left = Z;
Head->right = Z;
13.10.2015
Tietorakenteet ja algoritmit
K4.6
Z
14
§ 
Tämä esitystapa mahdollistaa liikkumisen puussa vain alaspäin
§ 
Jos halutaan liikkua myös ylös, voidaan lisätä kolmas linkki, dad,
joka osoittaa solmun isään
class TreeNode
{
private Object data;
private TreeNode left, right, dad;
TreeNode (Object element)
{
data = element;
left = null;
right = null;
dad = null;
}
}
13.10.2015
Tietorakenteet ja algoritmit
15
Luentotehtävä 1. Jos binääripuussa on N (ei-tyhjää) alkiota eli solmua,
niin mikä on sen korkeus
a) enintään?
b) vähintään?
2. Jos binääripuun korkeus on k,
niin kuinka monta alkiota siinä on
a) enintään?
b) vähintään?
13.10.2015
Tietorakenteet ja algoritmit
16
7.3.2
§ 
§ 
§ 
§ 
§ 
§ 
13.10.2015
Taulukkoesitys
Täydellinen binääripuu voidaan esittää yksinkertaisessa
taulukossa (muille binääripuille näin ei voi tehdä)
Juuri on taulukon 1. alkiossa
Paikassa k olevan solmun isä on paikassa k DIV 2
Paikassa k olevan solmun lapset ovat paikoissa 2*k ja 2*k+1
Viittauksille lapsiin (left, right) ei siis varata lainkaan tilaa
Esityksessä voi liikkua sekä ylös että alas puussa
Tietorakenteet ja algoritmit
17
7.3.3
§ 
Isä-linkit tai -taulukko yleiselle puulle
Jos puussa tarvitsee liikkua vain ylöspäin,
riittää kussakin solmusta tieto sen isästä.
Tämä voidaan toteuttaa joko dynaamisena
tietorakenteena tai taulukkona.
A
struct node {
char key;
struct node *dad;
};
R
A
S
13.10.2015
P
2
3
4
5
6
7
8
9
10
S
A
M
P
L
E
T
R
E
E!
3 10
8
8
8
8
9
10 -1
10!
Tietorakenteet ja algoritmit
E
T
M
typedef struct node * link;
k ! !1
!
a[k] !A
!
dad[k]!3
E
L
E
11 !
18
§ 
Jos yleisessä puussa halutaan liikkua alaspäin, kytketään
kunkin solmun jälkeläiset linkitetyksi listaksi. Siten voidaan
varata tilaa tarpeen mukaan.
§ 
Solmusta on osoitin vasemman puolimmaiseen lapseen ja
lähinnä oikealla olevaan veljeen
E
A
A
R
S
E
T
struct node {
char key;
struct node *First_child;
struct node *Next_sibling;
};
typedef struct node * link;
M
P
L
E
=> Esitysmuoto palautuu binääripuuksi!
13.10.2015
Tietorakenteet ja algoritmit
19
7.4
Puussa kulkeminen (traversing a tree)
§ 
Monessa tilanteessa pitää pystyä käymään läpi (traverse)
kaikki puussa olevat alkiot
§ 
Läpikäyntijärjestyksiä on useita
13.10.2015
• 
esijärjestys (preorder)
• 
sisäjärjestys (inorder)
• 
jälkijärjestys (postorder)
• 
tasojärjestys (level order)
Tietorakenteet ja algoritmit
20
§ 
Esijärjestyksessä puu käydään rekursiivisesti läpi järjestyksessä:
juuri - vasen alipuu - oikea alipuu
PM SAALE R T E E
§ 
Sisäjärjestyksessä puu käydään rekursiivisesti läpi järjestyksessä:
vasen alipuu - juuri - oikea alipuu
ASAMPLETREE
P
M
E
S
A
L
A
R
T
E
E
13.10.2015
Tietorakenteet ja algoritmit
21
§ 
Jälkijärjestyksessä puu käydään rekursiivisesti läpi järjestyksessä:
vasen alipuu - oikea alipuu – juuri
AAS M T E E R E LP
§ 
Tasojärjestyksessä puu käydään läpi ylhäältä alaspäin kukin taso
kerrallaan vasemmalta oikealle
PM LS EAAR T E E
P
M
E
S
A
L
A
R
T
E
E
13.10.2015
Tietorakenteet ja algoritmit
22
“Muistisääntö”:
§ 
Piirretään viiva juuren päältä lähtien vastapäivään puun
ympäri läheltä liipaten, tulostetaan solmu kun se
• 
• 
• 
ohitetaan vasemmalta
ohitetaan alta
ohitetaan oikealta
=> Esijärjestys
=> Sisäjärjestys
=> Jälkijärjestys
P
M
E
S
A
L
A
R
T
E
E
13.10.2015
Tietorakenteet ja algoritmit
23
§ 
Kolmen ensimmäisen läpikäyntitavan implementaatio on helpointa
tehdä rekursion avulla
P
void traverse_preorder(link t)
{
if (t != NULL) {
visit(t);
traverse_preorder(t->left);
traverse_preorder(t->right);
}
}
• 
13.10.2015
M
E
S
A
L
A
R
T
E
E
Osoitinmuuttujan t rooli läpikäyntialgoritmeissa on kulkija. Kentät t>left ja t->right ovat kiintoarvoja.
Tietorakenteet ja algoritmit
24
void traverse_inorder(link t)
{
if (t != NULL) {
traverse_inorder(t->left);
visit(t);
traverse_inorder(t->right);
S
}
}
A
void traverse_postorder(link t)
{
if (t != NULL) {
traverse_postorder(t->left);
traverse_postorder(t->right);
visit(t);
}
}
13.10.2015
Tietorakenteet ja algoritmit
P
M
L
E
A
R
T
E
E
25
Esijärjestys pinon avulla:
Tasojärjestyksen implementointi käy
helposti jonorakenteen avulla:
void
void
traverse_levelorder(link t)
traverse_preorder(link t)
{
{
put(t);
push(t);
do {
do {
t = get();
t = pop();
if (t != NULL) {
if (t != NULL) {
visit(t);
visit(t);
put(t->left);
push(t->right);
put(t->right);
push(t->left);
}
}
} while (!queue_empty());
} while (!stack_empty());
}
}
P
M
E
S
A
L
A
R
T
E
E
Operaatiot push() ja pop() kohdistuvat pinoon, jonka rooli on säiliö.
13.10.2015
Tietorakenteet ja algoritmit
26
Luentotehtävä • 
Esitä jonon sisältö, kun oheinen puu
käydään läpi tasojärjestyksessä annetulla
algoritmilla
P
• 
M
L
Parityöskentely sallittua! E
S
void traverse_levelorder(link t)
{
A
A
R
put(t);
do {
T
E
t = get();
if (t != NULL) {
E
visit(t);
put(t->left);
Esitä jonon sisältö jokaisen iteraation alussa: put(t->right);
P }
M L } while (!queue_empty());
L S }
… 13.10.2015
Tietorakenteet ja algoritmit
27
Luentotehtävä Esitä jonon sisältö, kun oheinen puu
käydään läpi tasojärjestyksessä annetulla
algoritmilla
void traverse_levelorder(link t)
{
put(t);
do {
t = get();
if (t != NULL) {
visit(t);
put(t->left);
put(t->right);
}
} while (!queue_empty());
}
P
• 
13.10.2015
M
E
S
A
A
P M L L S S E E A A A A R A R R T E E E P M L S E A A R T E E Tietorakenteet ja algoritmit
L
R
T
E
E
28
§ 
Yleisen puun läpikäynnissä em. algoritmit yleistetään
E
A
A
Esijärjestys
R
S
E
EAAS R T M PLE E
Jälkijärjestys
T
ASAMPLETREE
M
§ 
§ 
13.10.2015
P
L
E
Sisäjärjestys ei ole yksiselitteinen. Esim. juuri lasketaan 1. lapsen
jälkeen, mutta toteutus voisi olla toinenkin.
Koska yleinen puu on palautettavissa binääripuuksi, sitä koskevat
algoritmit voidaan yleistää binääripuun käsittelyalgoritmeista.
Tietorakenteet ja algoritmit
29
7.4.1
§ 
§ 
§ 
13.10.2015
Eräitä läpikäynnin sovelluksia:
Esijärjestys
• 
sisällysluettelon tulostaminen
• 
tiedostoluettelon tulostaminen
Sisäjärjestys
• 
hakupuun sisältö aakkostettuna
• 
lauseke infix-muodossa
Jälkijärjestys
• 
tulosyhteenveto
• 
lauseke postfix-muodossa
Tietorakenteet ja algoritmit
30
7.4.2
§ 
Läpikäyntijärjestyksen merkityksiä
Esijärjestys vastaa depth first-hakua
“etsitään tietty haara mahdollisimman pitkälle ennen kuin
peräännytään”
§ 
Tasojärjestys vastaa breadth first –hakua
“etsitään tietyllä etäisyydellä juuresta olevia solmuja.”
• 
13.10.2015
Näihin palataan verkkoalgoritmien yhteydessä kurssin lopussa.
Tietorakenteet ja algoritmit
31
7.5 Puiden sovelluksia
7.5.1
Jäsennyspuu.
Esimerkiksi lauseke voidaan esittää puurakenteen avulla
§ 
Alkuperäinen infix-lauseke:
5 * ( ( 9 + 8 ) * (4 + 6) + 7 )
§ 
Kun tämä puu käydään läpi
jälkijärjestyksessä, saadaan
lauseke postfix-muodossa :
+
598+46+*7+*
13.10.2015
Tietorakenteet ja algoritmit
32
§ 
Sisäjärjestys antaa lausekkeen alkuperäisessä infixmuodossa, kunhan sulut lisätään yhteenlaskusolmujen
oikeille puolille
5*((9+8)*(4+6)+7)
§ 
Esijärjestys antaa ns. prefix-muodon
*5+*+98+467
13.10.2015
Tietorakenteet ja algoritmit
33
Jäsennyspuun luominen:
1. 
Luetaan postfix-lauseketta merkki kerrallaan
598+46+*7+*
2. 
3. 
13.10.2015
Operandi =>
• 
Tehdään tästä uuden puun juuri
• 
Osoitin uuteen puuhun asetetaan pinoon
Operaattori =>
• 
Tehdään tästä uuden puun juuri
• 
Oikeaksi lapseksi popataan pinon päällimmäinen
• 
Vasemmaksi lapseksi seuraava
• 
Osoitin uuteen puuhun pinoon
Tietorakenteet ja algoritmit
34
Esim:
5
9
K4.10a
5
5
9
+
8
5
9
8
5
+
9
13.10.2015
Tietorakenteet ja algoritmit
8
35
4
6
5
5
4
9
8
+
8
*
5
5
+
9
13.10.2015
6
+
+
9
4
+
8
4
*
+
6
Tietorakenteet ja algoritmit
9
+
8
4
6
36
+
7
5
5
7
*
13.10.2015
+
8
7
*
+
9
+
4
+
6
9
Tietorakenteet ja algoritmit
+
8
4
6
37
*
*
5
+
7
*
+
9
13.10.2015
+
8
4
6
Tietorakenteet ja algoritmit
38
Puista lisää ensi kerralla:
7.5.2
• 
Binäärinen hakupuu
Tieto voidaan järjestää puuhun siten, että haku on nopeaa.
Esimerkki: binäärinen hakupuu (binary search tree)
K
E
C
S
G
R
A
J
U
T
X
I
13.10.2015
Tietorakenteet ja algoritmit
39
7.5.3
Keko
• 
Tieto voidaan järjestää puuhun siten, että suurimman
(pienimmän) alkion etsiminen on nopeaa.
• 
Keko on tärkeä prioriteettijono (itseopiskeluasiaa)
• 
Toteutus kuitenkin taulukkona!
X
T
O
G
A
13.10.2015
S
E
R
M
A
N
I
Tietorakenteet ja algoritmit
40