binarytree.rb
131 lines
| 4.5 KiB
| text/x-ruby
|
RubyLexer
|
r2976 | # binarytree.rb | ||
# | ||||
# $Revision: 1.5 $ by $Author: anupamsg $ | ||||
# $Name: $ | ||||
# | ||||
# = binarytree.rb - Binary Tree implementation | ||||
# | ||||
# Provides a generic tree data structure with ability to | ||||
# store keyed node elements in the tree. The implementation | ||||
# mixes in the Enumerable module. | ||||
# | ||||
# Author:: Anupam Sengupta (anupamsg@gmail.com) | ||||
# | ||||
# Copyright (c) 2007 Anupam Sengupta | ||||
# | ||||
# All rights reserved. | ||||
# | ||||
# Redistribution and use in source and binary forms, with or without modification, | ||||
# are permitted provided that the following conditions are met: | ||||
# | ||||
# - Redistributions of source code must retain the above copyright notice, this | ||||
# list of conditions and the following disclaimer. | ||||
# | ||||
# - Redistributions in binary form must reproduce the above copyright notice, this | ||||
# list of conditions and the following disclaimer in the documentation and/or | ||||
# other materials provided with the distribution. | ||||
# | ||||
# - Neither the name of the organization nor the names of its contributors may | ||||
# be used to endorse or promote products derived from this software without | ||||
# specific prior written permission. | ||||
# | ||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | ||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
# | ||||
require 'tree' | ||||
module Tree | ||||
# Provides a Binary tree implementation. This tree node allows only two child | ||||
# nodes (left and right childs). It also provides direct access to the left | ||||
# and right children, including assignment to the same. | ||||
class BinaryTreeNode < TreeNode | ||||
# Adds the specified child node to the receiver node. The child node's | ||||
# parent is set to be the receiver. The child nodes are added in the order | ||||
# of addition, i.e., the first child added becomes the left node, and the | ||||
# second child will be the second node. | ||||
# If only one child is present, then this will be the left child. | ||||
def add(child) | ||||
raise "Already has two child nodes" if @children.size == 2 | ||||
super(child) | ||||
end | ||||
# Returns the left child node. Note that | ||||
# left Child == first Child | ||||
def leftChild | ||||
children.first | ||||
end | ||||
# Returns the right child node. Note that | ||||
# right child == last child unless there is only one child. | ||||
# Returns nil if the right child does not exist. | ||||
def rightChild | ||||
children[1] | ||||
end | ||||
# Sets the left child. If a previous child existed, it is replaced. | ||||
def leftChild=(child) | ||||
@children[0] = child | ||||
@childrenHash[child.name] = child if child # Assign the name mapping | ||||
end | ||||
# Sets the right child. If a previous child existed, it is replaced. | ||||
def rightChild=(child) | ||||
@children[1] = child | ||||
@childrenHash[child.name] = child if child # Assign the name mapping | ||||
end | ||||
# Returns true if this is the left child of its parent. Always returns false | ||||
# if this is the root node. | ||||
def isLeftChild? | ||||
return nil if isRoot? | ||||
self == parent.leftChild | ||||
end | ||||
# Returns true if this is the right child of its parent. Always returns false | ||||
# if this is the root node. | ||||
def isRightChild? | ||||
return nil if isRoot? | ||||
self == parent.rightChild | ||||
end | ||||
# Swaps the left and right children with each other | ||||
def swap_children | ||||
tempChild = leftChild | ||||
self.leftChild= rightChild | ||||
self.rightChild= tempChild | ||||
end | ||||
end | ||||
end | ||||
# $Log: binarytree.rb,v $ | ||||
# Revision 1.5 2007/12/18 23:11:29 anupamsg | ||||
# Minor documentation changes in the binarytree class. | ||||
# | ||||
# Revision 1.4 2007/08/30 22:08:58 anupamsg | ||||
# Added a new swap_children method for Binary Tree. Also added minor | ||||
# documentation and test updates. | ||||
# | ||||
# Revision 1.3 2007/07/21 03:24:25 anupamsg | ||||
# Minor edits to parameter names. User visible functionality does not change. | ||||
# | ||||
# Revision 1.2 2007/07/18 20:15:06 anupamsg | ||||
# Added two predicate methods in BinaryTreeNode to determine whether a node | ||||
# is a left or a right node. | ||||
# | ||||
# Revision 1.1 2007/07/18 19:33:27 anupamsg | ||||
# Added a new binary tree implementation. | ||||
# | ||||