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
63
64
65
66
67
|
#!/usr/bin/env perl
use strict;
use warnings;
use feature ":all";
no warnings "experimental";
my $tree={
v=>5,
l=>{
v=>4,
l=>{
v=>11,
l=>{
v=>7
},
r=>{
v=>2
}
},
},
r=>{
v=>8,
l=>{
v=>13,
},
r=>{
v=>9,
r=>{
v=>1
}
}
}
};
my $target=$ARGV[0]//22;
my @stack=($tree);
while (@stack) {
given (shift @stack) {
for my $k (qw<l r>) {
if (exists $_->{$k}) {
$_->{$k}{p}=$_;
push @stack, $_->{$k};
}
}
if ((! exists $_->{l}) and (! exists $_->{r})) {
my $p=$_;
my @path;
my $sum=0;
while (defined $p) {
push @path, $p->{v};
$sum+=$p->{v};
$p=$p->{p};
}
if ($sum==$target) {
say join "->", reverse @path;
}
}
}
}
|