header updated
[jalview.git] / src / jalview / datamodel / BinaryNode.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 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