if i try the following code
#!/usr/bin/env perl use Tree::Simple; # Tree: # a # _________ | ________ # / | \ # bcd # / \ # ef # \ # g # my $tree = Tree::Simple->new('a', Tree::Simple->ROOT); $tree->addChildren( Tree::Simple->new('b'), Tree::Simple->new('c'), Tree::Simple->new('d'), ); $tree->getChild(1)->addChildren ( Tree::Simple->new('e'), Tree::Simple->new('f'), ); $tree->getChild(1)->getChild(1)->addChildren ( Tree::Simple->new('g'), ); $trav_func= sub { my $node = shift; printf "node : %s leaf : %3s root : %s\n", $node->getNodeValue, $node->isLeaf ? 'yes' : 'no', $node->isRoot ? 'yes' : 'no'; }; # traversal does not report the root - error ? print "------ preorder : traverse( \$trav_func ) \n"; $tree->traverse( $trav_func ); print "\n"; print "------ postorder : traverse( sub{}, \$trav_func ) \n"; $tree->traverse( sub{}, $trav_func ); print "\n";
conclusion
------ preorder : traverse( $trav_func ) node : b leaf : yes root : no node : c leaf : no root : no node : e leaf : yes root : no node : f leaf : no root : no node : g leaf : yes root : no node : d leaf : yes root : no ------ postorder : traverse( sub{}, $trav_func ) node : b leaf : yes root : no node : e leaf : yes root : no node : g leaf : yes root : no node : f leaf : no root : no node : c leaf : no root : no node : d leaf : yes root : no
indicates that root 'a' is not visited. My understanding of tree traversal is that all nodes should be visited. Am I mistaken or are there some cases where it makes sense not to visit the root?
Application:
The tree :: Simple :: traverse () is implemented as:
sub traverse { my ($self, $func, $post) = @_;
For the first node (root), $ func / $ post is not called, so it is not available for visiting.
If you override traverse () with
package My::Tree::Simple; use parent 'Tree::Simple';
It works as I expected.
source share