[PERL] aflopen boomstructuur

Pagina: 1
Acties:

  • Boeri
  • Registratie: Juni 2003
  • Laatst online: 26-01 18:10
Stel ik heb een html met de structuur van een land met per regel gegevens zoals naam, oppervlakte, aantal inwoners en de ouder van de record (Provincies,Gewesten,...). Regels waarvan de oppervlakte en het aantal inwoners geen waarde heeft duiden een ouder record aan.

Na ik de gegevens heb ingelezen maak ik een recordstructuur aan en steek ik deze in een hash. Het veld "ouder" laat ik refereren naar het overeenkomstige element in de hash.

Afbeeldingslocatie: http://img527.imageshack.us/img527/91/structuurws0.jpg

Ter eenvoudiging heb ik even een paar records hard gecodeerd en steek ik ze in een hash om ze makkelijk toegankelijk te maken :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$record = {
  "NAAM" => "Gent",
   "INWONERS" => "9999",
   "OPP" => "100",
   "OUDER" => "Oost-Vlaanderen"
};

$from{$record->{NAAM}}=$record;

$record = {
  "NAAM" => "Oost-Vlaanderen",
   "INWONERS" => "",
   "OPP" => "",
   "OUDER" => "Vlaams Gewest"      
};

$from{$record->{NAAM}}=$record;

$record = {
  "NAAM" => "Belgie",
   "INWONERS" => "",
   "OPP" => "",
   "OUDER" => ""       
};

$from{$record->{NAAM}}=$record;

$record = {
  "NAAM" => "Vlaams Gewest",
   "INWONERS" => "",
   "OPP" => "",
   "OUDER" => "Belgie"
};

$from{$record->{NAAM}}=$record;

$record = {
  "NAAM" => "Stekene",
   "INWONERS" => "99",
   "OPP" => "10",
   "OUDER" => "Oost-Vlaanderen"
};

$from{$record->{NAAM}}=$record;






foreach $k(keys %from){
  $from{$k}->{OUDER} = $from{ $from{$k}->{OUDER} };
}


Wil ik nu de ouders vinden van een bepaald kind kan ik dat via volgende code voor bv. het Vlaams Gewest:
code:
1
2
3
4
5
$x = "Vlaams Gewest";
do{
   print "$_ ";
   $x = $from{$x}->{OUDER}->{NAAM};
#}while defined;


Wil ik de kinderen van een bepaalde ouder doe ik dat met een geinverteerde hash voor bijvoord Oost-Vlaanderen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
while( ($k,$v) = each %from){
   push( @{ $children{ $v->{OUDER}->{NAAM}} }, $k );
}


$_ = "Oost-Vlaanderen";
if($children{$_}){
  @children = @{$children{$_}};
  print "@children";
}
else {
 @children = "nobody";
}


Mijn vraag is de volgende:
Ik heb nu alle records mooi in een hash, maar ik wil de populatie en oppervlakte velden van de ouders invullen aan de hand van de kinderen. Liefst zou ik subroutines (en het recursief oproepen ervan) vermijden. Dan kan ik best een stapel gebruiken? Als het niet anders lukt mag het met recursie natuurlijk, ben er enkel niet helemaal in thuis.

Wil dus dit bereiken:
Afbeeldingslocatie: http://img160.imageshack.us/img160/7664/structeq4.jpg

Graag enige aanwijzing! Dankjewel! (Oplossing is daarom niet nodig, pseudocode zou al veel zijn!)

Verwijderd

ik denk dat je een binaire boom wilt doorlopen, als ik je tenminste goed heb begrepen. Nu spreek ik geen perl, maar ik denk dat je hier wel wat aan hebt. Uitgewerkt voorbeeld met commentaar!
http://www.unix.org.ua/orelly/perl/cookbook/ch11_16.htm

  • Boeri
  • Registratie: Juni 2003
  • Laatst online: 26-01 18:10
Dankjewel!
Heb het eigenlijk eenvoudig kunnen oplossen met de combinatie van de stukjes code die ik al gevonden had.
Alle keys van de hash afgelopen daarna gekeken als de value van de key geen kind heeft en dan de boom helemaal opgeklommen en elk veld vermeerderd met de waarde van het kind waar alles mee begon. Simpel maar begon alles te moeilijk voor te stellen :(