Mercurial > hg > soundsoftware-site
comparison vendor/gems/rubytree-0.5.2/lib/tree/binarytree.rb @ 0:513646585e45
* Import Redmine trunk SVN rev 3859
author | Chris Cannam |
---|---|
date | Fri, 23 Jul 2010 15:52:44 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:513646585e45 |
---|---|
1 # binarytree.rb | |
2 # | |
3 # $Revision: 1.5 $ by $Author: anupamsg $ | |
4 # $Name: $ | |
5 # | |
6 # = binarytree.rb - Binary Tree implementation | |
7 # | |
8 # Provides a generic tree data structure with ability to | |
9 # store keyed node elements in the tree. The implementation | |
10 # mixes in the Enumerable module. | |
11 # | |
12 # Author:: Anupam Sengupta (anupamsg@gmail.com) | |
13 # | |
14 | |
15 # Copyright (c) 2007 Anupam Sengupta | |
16 # | |
17 # All rights reserved. | |
18 # | |
19 # Redistribution and use in source and binary forms, with or without modification, | |
20 # are permitted provided that the following conditions are met: | |
21 # | |
22 # - Redistributions of source code must retain the above copyright notice, this | |
23 # list of conditions and the following disclaimer. | |
24 # | |
25 # - Redistributions in binary form must reproduce the above copyright notice, this | |
26 # list of conditions and the following disclaimer in the documentation and/or | |
27 # other materials provided with the distribution. | |
28 # | |
29 # - Neither the name of the organization nor the names of its contributors may | |
30 # be used to endorse or promote products derived from this software without | |
31 # specific prior written permission. | |
32 # | |
33 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
34 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
35 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
36 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | |
37 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
38 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
39 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
40 # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
41 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
42 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
43 # | |
44 | |
45 require 'tree' | |
46 | |
47 module Tree | |
48 | |
49 # Provides a Binary tree implementation. This tree node allows only two child | |
50 # nodes (left and right childs). It also provides direct access to the left | |
51 # and right children, including assignment to the same. | |
52 class BinaryTreeNode < TreeNode | |
53 | |
54 # Adds the specified child node to the receiver node. The child node's | |
55 # parent is set to be the receiver. The child nodes are added in the order | |
56 # of addition, i.e., the first child added becomes the left node, and the | |
57 # second child will be the second node. | |
58 # If only one child is present, then this will be the left child. | |
59 def add(child) | |
60 raise "Already has two child nodes" if @children.size == 2 | |
61 | |
62 super(child) | |
63 end | |
64 | |
65 # Returns the left child node. Note that | |
66 # left Child == first Child | |
67 def leftChild | |
68 children.first | |
69 end | |
70 | |
71 # Returns the right child node. Note that | |
72 # right child == last child unless there is only one child. | |
73 # Returns nil if the right child does not exist. | |
74 def rightChild | |
75 children[1] | |
76 end | |
77 | |
78 # Sets the left child. If a previous child existed, it is replaced. | |
79 def leftChild=(child) | |
80 @children[0] = child | |
81 @childrenHash[child.name] = child if child # Assign the name mapping | |
82 end | |
83 | |
84 # Sets the right child. If a previous child existed, it is replaced. | |
85 def rightChild=(child) | |
86 @children[1] = child | |
87 @childrenHash[child.name] = child if child # Assign the name mapping | |
88 end | |
89 | |
90 # Returns true if this is the left child of its parent. Always returns false | |
91 # if this is the root node. | |
92 def isLeftChild? | |
93 return nil if isRoot? | |
94 self == parent.leftChild | |
95 end | |
96 | |
97 # Returns true if this is the right child of its parent. Always returns false | |
98 # if this is the root node. | |
99 def isRightChild? | |
100 return nil if isRoot? | |
101 self == parent.rightChild | |
102 end | |
103 | |
104 # Swaps the left and right children with each other | |
105 def swap_children | |
106 tempChild = leftChild | |
107 self.leftChild= rightChild | |
108 self.rightChild= tempChild | |
109 end | |
110 end | |
111 | |
112 end | |
113 | |
114 # $Log: binarytree.rb,v $ | |
115 # Revision 1.5 2007/12/18 23:11:29 anupamsg | |
116 # Minor documentation changes in the binarytree class. | |
117 # | |
118 # Revision 1.4 2007/08/30 22:08:58 anupamsg | |
119 # Added a new swap_children method for Binary Tree. Also added minor | |
120 # documentation and test updates. | |
121 # | |
122 # Revision 1.3 2007/07/21 03:24:25 anupamsg | |
123 # Minor edits to parameter names. User visible functionality does not change. | |
124 # | |
125 # Revision 1.2 2007/07/18 20:15:06 anupamsg | |
126 # Added two predicate methods in BinaryTreeNode to determine whether a node | |
127 # is a left or a right node. | |
128 # | |
129 # Revision 1.1 2007/07/18 19:33:27 anupamsg | |
130 # Added a new binary tree implementation. | |
131 # |