my $tree = [ 1
, [ 2
, 3
, [ 4
, [ 5 ]
, 6 ] ]
, 7 ] ;
sub traverse {
my ($nodefn, $tree, $depth) = @_;
$depth ||= 0;
$depth++;
for (@$tree) {
ref() ? traverse( $nodefn, $_, $depth )
: $nodefn->( $_, $depth );
}
}
####
sub count_nodes {
my $count;
traverse( sub { $count++ }, @_ );
$count;
}
print count_nodes($tree), $/;
# 7
####
sub print_node {
my ($leaf, $depth) = @_;
print " " x ($depth - 1), "* $leaf", $/;
}
####
traverse( \&print_node, $tree );
# * 1
# * 2
# * 3
# * 4
# * 5
# * 6
# * 7
####
sub bfs_traverse {
my ($nodefn, $tree, $depth) = @_;
$depth ||= 0;
$depth++;
my @leaves = grep !ref(), @$tree;
my @branches = grep ref(), @$tree;
$nodefn->( $_, $depth ) for @leaves;
bfs_traverse( $nodefn, [map @$_, @branches], $depth )
if @branches;
}
####
bfs_traverse( \&print_node, $tree );
# * 1
# * 7
# * 2
# * 3
# * 4
# * 6
# * 5