#!/usr/bin/perl use strict; use warnings; use Data::Dumper; package BinTree; sub new { my $class = shift; my $val = shift; my $self = { val => $val, l => undef, r => undef }; bless $self, ref($class) || $class; return $self; } sub set_l { my $self = shift; my $val = shift; if (ref $self->{l}) { $self->{l}->append($val); } else { $self->{l} = $self->new($val); } } sub set_r { my $self = shift; my $val = shift; if (ref $self->{r}) { $self->{r}->append($val); } else { $self->{r} = $self->new($val); } } sub to_s { my $self = shift; my $v = $self->{val}; my $l = ref $self->{l} ? $self->{l}->to_s : undef; my $r = ref $self->{r} ? $self->{r}->to_s : undef; return join ', ', grep defined, ($l, $v, $r); } sub append { my $self = shift; my @vals = @_; while ( my $n = shift @vals ) { if ($n < $self->{val}) { $self->set_l($n) } elsif ($n > $self->{val}) { $self->set_r($n) } } } package main; my @list = (20, 4, 28, 9, 100, 12, 84, 10, 11); my $tree = BinTree->new(shift @list); $tree->append(@list); print $tree->to_s . "\n" x 2; print Dumper $tree;