sub FIRSTNODE { my ($root_node) = @_; my $node = $root_node; while ($node->{left}) { $node = $node->{left}; } return $node; } sub NEXTNODE { my ($node) = @_; if ($node->{right}) { $node = FIRSTNODE($node->{right}); } elsif ($node->{parent}) { if ($node->{parent}->{left} == $node) { $node = $node->{parent}; } else { while ($node->{parent}->{right} == $node) { $node = $node->{parent}; } return unless $node; $node = $node->{parent}; } } else { $node = undef; } return $node; }