Here is a sample program that illustrates building a binary search tree, printing its elements in sorted order, and calculating its height. You can also get the file here.

#!/usr/bin/perl -w

sub new_node {
  my( $node_val, $left_ptr, $right_ptr ) = @_;

  my( $tmp ) = {
    "value" => $node_val,
    "left" => $left_ptr,
    "right" => $right_ptr,
  };
  return $tmp;
}

sub add_node {
  my( $node, $value ) = @_;

  if ( $node->{value} gt $value ) {
    if ( defined( $node->{left} ) ) {
      &add_node( $node->{left}, $value );
    } else {
      $node->{left} = &new_node( $value, undef, undef );
    }
  } else {
    if ( defined( $node->{right} ) ) {
      &add_node( $node->{right}, $value );
    } else {
      $node->{right} = &new_node( $value, undef, undef );
    }
  }
}

sub traverse {
  my($node) = @_;
  if ( defined( $node->{left} ) ) {
    &traverse( $node->{left} );
  }
  print "$node->{value}\n";
  if ( defined( $node->{right} ) ) {
    &traverse( $node->{right} );
  }
}

sub height {
  my($node) = @_;
  my($retval) = 0;
  if ( defined( $node->{left} ) ) {
    $retval = &height( $node->{left} ) + 1;
  }
  if ( defined( $node->{right} ) ) {
    my($tmp) = &height( $node->{right} ) + 1;
    if ($tmp > $retval) { $retval = $tmp; }
  }
  return $retval;
}

@list = qw( bear aardvark cobra dingo elephant );
$root = &new_node( shift @list, undef, undef );
while (@list) { &add_node( $root, shift @list ); }
&traverse( $root );
$result = &height( $root );
print "Height = $result\n";