blob: 88b6bc7045509e65ed48b3e8fe6013d74aaba869 (
plain)
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
|
#!/usr/bin/perl
use strict;
use warnings;
use feature qw/say/;
use Data::Dumper;
sub children { my $i = shift; 2*$i+1, 2*$i+2 }
sub parent { my $i = shift; ($i-1)/2; } # not needed here
sub display {
my $bft_tree = bft(shift);
my $start = scalar @{$bft_tree->[-1]};
my $sep_val = (2 * $start) - 1;
for my $line (@$bft_tree) {
my $sep = " " x $sep_val;
say " " x $start, join $sep, @$line;
$start /= 2;
$sep_val = ($sep_val - 1) / 2;
}
}
sub bft { # Breadth First Traversal
my $tree = shift;
my ($index, $level) = (0, 0);
my @bft_tree;
while ($index < scalar @$tree) {
my $new_index = $index + 2 ** $level - 1;
push @{$bft_tree[$level++]}, @{$tree}[$index .. $new_index];
$index = $new_index + 1;
}
return \@bft_tree;
}
my $tree = [ 1..7 ];
say "\nTree before change:";
display $tree;
my $sum = 0;
$sum += $_ for @$tree;
my $new_tree = [ map $sum - $_, @$tree ];
say "\nNew tree";
display $new_tree;
|