Thread Rekursion mittels Array
(7 answers)
Opened by peterb at 2017-12-05 11:03 Code (perl): (dl
)
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 54 55 56 57 58 59 60 61 62 #!/usr/bin/perl use strict; use warnings; my %data; # Abhängigkeiten zusammen stellen for my $line (<DATA>) { chomp $line; # Abhängigkeit my ($key, $value) = split /\s*-->\s*/, $line; # Neues Element im hash erzeugen wenn nötig. for my $k ($key, $value){ next if($data{$k}); $data{$k} = { name => $k }; } # Im Kind markieren wer der Vater ist push(@{$data{$value}->{parents}},$key); } #kinder zusammen suchen / Baum erstellen for my $elm (values(%data)) { next unless $elm->{parents}; for my $key (@{$elm->{parents}}) { push( @{$data{$key}->{children}}, $elm ); } } # alle Kinder aus %data entfernen for my $key (keys(%data)) { next unless($data{$key}->{parents}); delete($data{$key}->{parents}); delete($data{$key}); } # Es ist nur noch das "root" Element in %data my $root = (values(%data))[0]; # Den erzeugen Baum anzeigen my @stack = (['', $root ]); while(@stack) { my ($deep,$entry) = @{shift(@stack)}; print "$deep$entry->{name}\n"; for my $next ( sort{ $b->{name} cmp $a->{name} }@{$entry->{children}} ) { unshift(@stack,["$deep ", $next]); } } __DATA__ 1A --> 2A 1A --> 2B 2A --> 4A 2A --> 5A 4A --> 5A 2B --> 3A 3A --> 4A Last edited: 2017-12-06 22:26:21 +0100 (CET) |