$ perl fringe.pl
---
[[1, [[2, 3], [4, [[[5, 6], [7, 8]], [9, 10]]]]]]
[1, [[2, 3], [4, [[[5, 6], [7, 8]], [9, 10]]]]]
leaf: 1
---
[[[2, 3], [4, [[[5, 6], [7, 8]], [9, 10]]]]]
[[2, 3], [4, [[[5, 6], [7, 8]], [9, 10]]]]
[2, 3, [4, [[[5, 6], [7, 8]], [9, 10]]]]
leaf: 2
---
[3, [4, [[[5, 6], [7, 8]], [9, 10]]]]
leaf: 3
---
[[4, [[[5, 6], [7, 8]], [9, 10]]]]
[4, [[[5, 6], [7, 8]], [9, 10]]]
leaf: 4
---
[[[[5, 6], [7, 8]], [9, 10]]]
[[[5, 6], [7, 8]], [9, 10]]
[[5, 6], [7, 8], [9, 10]]
[5, 6, [7, 8], [9, 10]]
leaf: 5
---
[6, [7, 8], [9, 10]]
leaf: 6
---
[[7, 8], [9, 10]]
[7, 8, [9, 10]]
leaf: 7
---
[8, [9, 10]]
leaf: 8
---
[[9, 10]]
[9, 10]
leaf: 9
---
[10]
leaf: 10
---
[]
####
$ perl fringe.pl
---
tree: [1, [[2, 3], [4, [[[5, 6], [7, 8]], [9, 10]]]]]
rtrees: []
traverse L
tree: 1
rtrees: [[[2, 3], [4, [[[5, 6], [7, 8]], [9, 10]]]]]
leaf: 1
---
tree: [[2, 3], [4, [[[5, 6], [7, 8]], [9, 10]]]]
rtrees: []
traverse L
tree: [2, 3]
rtrees: [[4, [[[5, 6], [7, 8]], [9, 10]]]]
traverse L
tree: 2
rtrees: [[4, [[[5, 6], [7, 8]], [9, 10]]], 3]
leaf: 2
---
tree: 3
rtrees: [[4, [[[5, 6], [7, 8]], [9, 10]]]]
leaf: 3
---
tree: [4, [[[5, 6], [7, 8]], [9, 10]]]
rtrees: []
traverse L
tree: 4
rtrees: [[[[5, 6], [7, 8]], [9, 10]]]
leaf: 4
---
tree: [[[5, 6], [7, 8]], [9, 10]]
rtrees: []
traverse L
tree: [[5, 6], [7, 8]]
rtrees: [[9, 10]]
traverse L
tree: [5, 6]
rtrees: [[9, 10], [7, 8]]
traverse L
tree: 5
rtrees: [[9, 10], [7, 8], 6]
leaf: 5
---
tree: 6
rtrees: [[9, 10], [7, 8]]
leaf: 6
---
tree: [7, 8]
rtrees: [[9, 10]]
traverse L
tree: 7
rtrees: [[9, 10], 8]
leaf: 7
---
tree: 8
rtrees: [[9, 10]]
leaf: 8
---
tree: [9, 10]
rtrees: []
traverse L
tree: 9
rtrees: [10]
leaf: 9
---
tree: 10
rtrees: []
leaf: 10
---
tree: undef
rtrees: []
####
#!/usr/bin/perl
use strict;
use Data::Dump 'dd';
my $tree =
[
1, [[2, 3], [4, [[[5, 6], [7, 8]], [9, 10]]]]
];
#my $T = get_tree_iterator($tree);
#my $T = get_tree_iterator_explicit($tree);
#my $T = get_tree_iterator_2($tree);
my $T = get_tree_iterator_2_explicit($tree);
while (my $leaf = $T->()) {
print "leaf: $leaf\n";
}
sub get_tree_iterator {
my @stack = (shift);
return sub {
print "---\n";
dd \@stack;
while (@stack and ref $stack[0] eq 'ARRAY') {
unshift @stack, @{shift @stack};
dd \@stack
}
return shift @stack;
}
}
sub get_tree_iterator_explicit {
my @stack = (shift);
return sub {
print "---\n";
dd \@stack;
while (@stack and ref $stack[0] eq 'ARRAY') {
print " split tree into left & right\n";
unshift @stack, @{shift @stack};
dd \@stack
}
return shift @stack;
}
}
sub get_tree_iterator_2 {
my @rtrees = (shift);
my $tree;
return sub {
$tree = pop @rtrees;
print "---\n";
print "tree: "; dd $tree;
print "rtrees: "; dd \@rtrees;
($tree, $rtrees[@rtrees]) = @$tree while ref $tree;
return $tree;
}
}
sub get_tree_iterator_2_explicit {
my @rtrees = (shift);
my $tree;
return sub {
$tree = pop @rtrees;
print "---\n";
print "tree: "; dd $tree;
print "rtrees: "; dd \@rtrees;
while (ref $tree) {
print "traverse L\n";
($tree, $rtrees[@rtrees]) = @$tree;
print " tree: "; dd $tree;
print " rtrees: "; dd \@rtrees;
}
return $tree;
}
}