11 BinaryTree->meta->add_attribute('uid' => (
16 ("$instance" =~ /\((.*?)\)$/)[0];
20 BinaryTree->meta->add_attribute('node' => (
21 reader => 'getNodeValue',
22 writer => 'setNodeValue',
23 clearer => 'clearNodeValue',
27 BinaryTree->meta->add_attribute('parent' => (
28 predicate => 'hasParent',
29 reader => 'getParent',
30 writer => 'setParent',
31 clearer => 'clearParent',
34 BinaryTree->meta->add_attribute('left' => (
35 predicate => 'hasLeft',
36 clearer => 'clearLeft',
40 my ($self, $tree) = @_;
41 confess "undef left" unless defined $tree;
42 $tree->setParent($self) if defined $tree;
43 $self->{'left'} = $tree;
49 BinaryTree->meta->add_attribute('right' => (
50 predicate => 'hasRight',
51 clearer => 'clearRight',
55 my ($self, $tree) = @_;
56 confess "undef right" unless defined $tree;
57 $tree->setParent($self) if defined $tree;
58 $self->{'right'} = $tree;
66 $class->meta->new_object(':node' => shift);
71 my $left = $self->getLeft();
79 my $right = $self->getRight;
87 return (!$self->hasLeft && !$self->hasRight);
92 return !$self->hasParent;
96 my ($self, $func) = @_;
98 $self->getLeft->traverse($func) if $self->hasLeft;
99 $self->getRight->traverse($func) if $self->hasRight;
104 # swap left for right
105 if( $self->hasLeft && $self->hasRight) {
106 my $left = $self->getLeft;
107 my $right = $self->getRight;
108 $self->setLeft($right);
109 $self->setRight($left);
110 } elsif( $self->hasLeft && !$self->hasRight){
111 my $left = $self->getLeft;
113 $self->setRight($left);
114 } elsif( !$self->hasLeft && $self->hasRight){
115 my $right = $self->getRight;
117 $self->setLeft($right);
121 $self->getLeft->mirror if $self->hasLeft;
122 $self->getRight->mirror if $self->hasRight;
129 $size += $self->getLeft->size if $self->hasLeft;
130 $size += $self->getRight->size if $self->hasRight;
136 my ($left_height, $right_height) = (0, 0);
137 $left_height = $self->getLeft->height() if $self->hasLeft();
138 $right_height = $self->getRight->height() if $self->hasRight();
139 return 1 + (($left_height > $right_height) ? $left_height : $right_height);