Skip to content

Instantly share code, notes, and snippets.

@LastOfTheCarelessMen
Created February 11, 2010 12:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LastOfTheCarelessMen/301457 to your computer and use it in GitHub Desktop.
Save LastOfTheCarelessMen/301457 to your computer and use it in GitHub Desktop.
# bintree - binary tree demo program
# adapted from "Perl Cookbook", Recipe 11.15
# converted to modern Perl 6 by SF & Carl Masak
use v6;
role Found { has Int $.found is rw }
my %root;
for (1..1000).pick(20) {
insert(%root, $_);
}
enum TraversalMode <pre-order in-order post-order>;
say "Pre order: { collect(%root, pre-order) }";
say "In order: { collect(%root, in-order) }";
say "Post order: { collect(%root, post-order) }";
while defined (my $sought = prompt('Search? ')) {
if (my $node = search(%root, $sought)) {
say "Found $sought at { $node.perl }: { $node<VALUE> }";
say "(again!)" if $node<VALUE>.found > 1;
}
else {
say "No $sought in tree";
}
}
say "\nGoodbye!";
#########################################
sub insert(%tree is rw, Int $val) {
unless %tree {
%tree<LEFT> = {};
%tree<RIGHT> = {};
%tree<VALUE> = $val but Found(0);
return;
}
if (%tree<VALUE> > $val) { insert(%tree<LEFT>, $val) }
elsif (%tree<VALUE> < $val) { insert(%tree<RIGHT>, $val) }
else { warn "dup insert of $val\n" }
}
sub traverse(%tree, TraversalMode $method) {
return unless %tree;
given $method {
when pre-order {
traverse(%tree<LEFT>, $method);
traverse(%tree<RIGHT>, $method);
take %tree<VALUE>;
}
when in-order {
traverse(%tree<LEFT>, $method);
take %tree<VALUE>;
traverse(%tree<RIGHT>, $method);
}
when post-order {
take %tree<VALUE>;
traverse(%tree<LEFT>, $method);
traverse(%tree<RIGHT>, $method);
}
}
}
sub collect(%tree, TraversalMode $method) {
gather {
traverse(%tree, $method);
}
}
sub search (%tree is rw, $value) {
return unless %tree;
return search(%tree{$value < %tree<VALUE> ?? "LEFT" !! "RIGHT"}, $value)
unless %tree<VALUE> == $value;
%tree<VALUE>.found++;
return %tree;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment