aboutsummaryrefslogtreecommitdiff
path: root/challenge-094/perlboy1967/perl/ch-2.pl
blob: 9aabb05c58b1d88441ef0955643ee9ccee4b168a (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
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/perl

# Perl Weekly Challenge - 093
# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-093/
#
# Task 2 - Binary Tree to Linked List
#
# Author: Niels 'PerlBoy' van Dijke

use v5.16;
use strict;
use warnings;

use List::Util qw(sum);
use Data::Printer;

sub treeToList(\@\@);

# Unbuffered STDOUT
$|++;

my %tree = ( 
  'Tree 1 (balanced)' => 
    [1, 
      [2, 
        [3, []],
        [4, []] 
      ],
      [5,
        [6, []],
        [7, []]
      ]
    ],
  'Tree 2 (empty left node)' => 
    [3,
      [2, []],
      [4,
        [1, 
          [9, []],
          [],
        ],
        []
      ]
    ],
  'Tree 3 (straight to right)' =>
    [3,
      [],
      [5,
        [1,
          [9, []],
          [],
        ],
        []
      ]
    ],
);

foreach my $case (sort keys %tree) {
  my (@nodes);

  treeToList(@nodes, @{$tree{$case}});

  printf "===============================\n";
  printf "Tree: '%s'\n", $case;
  p $tree{$case};
  printf "List: (%s)\n", join(' -> ', @nodes);
  printf "===============================\n\n";
}

sub treeToList (\@\@) {
  my ($arN, $ar) = @_;

  foreach my $a (@$ar) {
    if (ref($a) eq '') {
      push(@$arN, $a);
    } elsif (ref($a) eq 'ARRAY' and
             scalar(@$a) > 0) {
      treeToList(@$arN, @$a);
    }
  }
}