Thread Rekursion mittels Array (7 answers)
Opened by peterb at 2017-12-05 11:03

Gast wer
 2017-12-06 22:08
#187702 #187702
more (13.4kb):
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)

View full thread Rekursion mittels Array