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; } #### sub FIRSTKEY { my $node = FIRSTNODE($root_node); return $node && $node->{key}; } sub NEXTKEY { my ($key) = @_; my $node = NEXTNODE (FindNode ($key)); return $node && $node->{key}; }