javadoc
[jalview.git] / src / jalview / datamodel / BinaryNode.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.datamodel;\r
20 \r
21 /**\r
22  * DOCUMENT ME!\r
23  *\r
24  * @author $author$\r
25  * @version $Revision$\r
26  */\r
27 public class BinaryNode\r
28 {\r
29   Object element;\r
30   String name;\r
31   BinaryNode left;\r
32   BinaryNode right;\r
33   BinaryNode parent;\r
34 \r
35   /** DOCUMENT ME!! */\r
36   public int bootstrap;\r
37 \r
38   /**\r
39    * Creates a new BinaryNode object.\r
40    */\r
41   public BinaryNode()\r
42   {\r
43     left = right = parent = null;\r
44     bootstrap = 0;\r
45   }\r
46 \r
47   /**\r
48    * Creates a new BinaryNode object.\r
49    *\r
50    * @param element DOCUMENT ME!\r
51    * @param parent DOCUMENT ME!\r
52    * @param name DOCUMENT ME!\r
53    */\r
54   public BinaryNode(Object element, BinaryNode parent, String name)\r
55   {\r
56     this.element = element;\r
57     this.parent = parent;\r
58     this.name = name;\r
59 \r
60     left = right = null;\r
61   }\r
62 \r
63   /**\r
64    * DOCUMENT ME!\r
65    *\r
66    * @return DOCUMENT ME!\r
67    */\r
68   public Object element()\r
69   {\r
70     return element;\r
71   }\r
72 \r
73   /**\r
74    * DOCUMENT ME!\r
75    *\r
76    * @param v DOCUMENT ME!\r
77    *\r
78    * @return DOCUMENT ME!\r
79    */\r
80   public Object setElement(Object v)\r
81   {\r
82     return element = v;\r
83   }\r
84 \r
85   /**\r
86    * DOCUMENT ME!\r
87    *\r
88    * @return DOCUMENT ME!\r
89    */\r
90   public BinaryNode left()\r
91   {\r
92     return left;\r
93   }\r
94 \r
95   /**\r
96    * DOCUMENT ME!\r
97    *\r
98    * @param n DOCUMENT ME!\r
99    *\r
100    * @return DOCUMENT ME!\r
101    */\r
102   public BinaryNode setLeft(BinaryNode n)\r
103   {\r
104     return left = n;\r
105   }\r
106 \r
107   /**\r
108    * DOCUMENT ME!\r
109    *\r
110    * @return DOCUMENT ME!\r
111    */\r
112   public BinaryNode right()\r
113   {\r
114     return right;\r
115   }\r
116 \r
117   /**\r
118    * DOCUMENT ME!\r
119    *\r
120    * @param n DOCUMENT ME!\r
121    *\r
122    * @return DOCUMENT ME!\r
123    */\r
124   public BinaryNode setRight(BinaryNode n)\r
125   {\r
126     return right = n;\r
127   }\r
128 \r
129   /**\r
130    * DOCUMENT ME!\r
131    *\r
132    * @return DOCUMENT ME!\r
133    */\r
134   public BinaryNode parent()\r
135   {\r
136     return parent;\r
137   }\r
138 \r
139   /**\r
140    * DOCUMENT ME!\r
141    *\r
142    * @param n DOCUMENT ME!\r
143    *\r
144    * @return DOCUMENT ME!\r
145    */\r
146   public BinaryNode setParent(BinaryNode n)\r
147   {\r
148     return parent = n;\r
149   }\r
150 \r
151   /**\r
152    * DOCUMENT ME!\r
153    *\r
154    * @return DOCUMENT ME!\r
155    */\r
156   public boolean isLeaf()\r
157   {\r
158     return (left == null) && (right == null);\r
159   }\r
160 \r
161   /**\r
162    * attaches FIRST and SECOND node arguments as the LEFT and RIGHT children of this node (removing any old references)\r
163    * a null parameter DOES NOT mean that the pointer to the corresponding child node is set to  NULL - you  should use\r
164    * setChild(null), or detach() for this.\r
165    *\r
166    */\r
167   public void SetChildren(BinaryNode leftchild, BinaryNode rightchild)\r
168   {\r
169     if (leftchild != null)\r
170     {\r
171       this.setLeft(leftchild);\r
172       leftchild.detach();\r
173       leftchild.setParent(this);\r
174     }\r
175 \r
176     if (rightchild != null)\r
177     {\r
178       this.setRight(rightchild);\r
179       rightchild.detach();\r
180       rightchild.setParent(this);\r
181     }\r
182   }\r
183 \r
184   /**\r
185    * Detaches the node from the binary tree, along with all its child nodes.\r
186    * @return BinaryNode The detached node.\r
187    */\r
188   public BinaryNode detach()\r
189   {\r
190     if (this.parent != null)\r
191     {\r
192       if (this.parent.left == this)\r
193       {\r
194         this.parent.left = null;\r
195       }\r
196       else\r
197       {\r
198         if (this.parent.right == this)\r
199         {\r
200           this.parent.right = null;\r
201         }\r
202       }\r
203     }\r
204 \r
205     this.parent = null;\r
206 \r
207     return this;\r
208   }\r
209 \r
210   /**\r
211    * Traverses up through the tree until a node with a free leftchild is discovered.\r
212    * @return BinaryNode\r
213    */\r
214   public BinaryNode ascendLeft()\r
215   {\r
216     BinaryNode c = this;\r
217 \r
218     do\r
219     {\r
220       c = c.parent();\r
221     }\r
222     while ( (c != null) && (c.left() != null) && !c.left().isLeaf());\r
223 \r
224     return c;\r
225   }\r
226 \r
227   /**\r
228    * Traverses up through the tree until a node with a free rightchild is discovered.\r
229    * Jalview builds trees by descent on the left, so this may be unused.\r
230    * @return BinaryNode\r
231    */\r
232   public BinaryNode ascendRight()\r
233   {\r
234     BinaryNode c = this;\r
235 \r
236     do\r
237     {\r
238       c = c.parent();\r
239     }\r
240     while ( (c != null) && (c.right() != null) && !c.right().isLeaf());\r
241 \r
242     return c;\r
243   }\r
244 \r
245   /**\r
246    * DOCUMENT ME!\r
247    *\r
248    * @param name DOCUMENT ME!\r
249    */\r
250   public void setName(String name)\r
251   {\r
252     this.name = name;\r
253   }\r
254 \r
255   /**\r
256    * DOCUMENT ME!\r
257    *\r
258    * @return DOCUMENT ME!\r
259    */\r
260   public String getName()\r
261   {\r
262     return this.name;\r
263   }\r
264 \r
265   /**\r
266    * DOCUMENT ME!\r
267    *\r
268    * @param boot DOCUMENT ME!\r
269    */\r
270   public void setBootstrap(int boot)\r
271   {\r
272     this.bootstrap = boot;\r
273   }\r
274 \r
275   /**\r
276    * DOCUMENT ME!\r
277    *\r
278    * @return DOCUMENT ME!\r
279    */\r
280   public int getBootstrap()\r
281   {\r
282     return bootstrap;\r
283   }\r
284 }\r