sub traverse { my($node, $visitor) = @_; $visitor->pre_order($node); traverse($node->{left}, $visitor) if defined $node->{left}; $visitor->in_order($node); traverse($node->{right}, $visitor) if defined $node->{right}; $visitor->post_order($node); }