applied LGPLv3 and source code formatting.
[vamsas.git] / src / uk / ac / vamsas / objects / utils / trees / BinaryNode.java
1 /*\r
2  * This file is part of the Vamsas Client version 0.1. \r
3  * Copyright 2009 by Jim Procter, Iain Milne, Pierre Marguerite, \r
4  *  Andrew Waterhouse and Dominik Lindner.\r
5  * \r
6  * Earlier versions have also been incorporated into Jalview version 2.4 \r
7  * since 2008, and TOPALi version 2 since 2007.\r
8  * \r
9  * The Vamsas Client is free software: you can redistribute it and/or modify\r
10  * it under the terms of the GNU Lesser General Public License as published by\r
11  * the Free Software Foundation, either version 3 of the License, or\r
12  * (at your option) any later version.\r
13  *  \r
14  * The Vamsas Client is distributed in the hope that it will be useful,\r
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
17  * GNU Lesser General Public License for more details.\r
18  * \r
19  * You should have received a copy of the GNU Lesser General Public License\r
20  * along with the Vamsas Client.  If not, see <http://www.gnu.org/licenses/>.\r
21  */\r
22 package uk.ac.vamsas.objects.utils.trees;\r
23 \r
24 import uk.ac.vamsas.client.Vobject;\r
25 import uk.ac.vamsas.client.VorbaId;\r
26 \r
27 public class BinaryNode {\r
28   Vobject element;\r
29 \r
30   String name;\r
31 \r
32   BinaryNode left;\r
33 \r
34   BinaryNode right;\r
35 \r
36   BinaryNode parent;\r
37 \r
38   /** bootstrap is non-negative integer */\r
39   public int bootstrap = -1;\r
40 \r
41   /**\r
42    * Creates a new BinaryNode object.\r
43    */\r
44   public BinaryNode() {\r
45     left = right = parent = null;\r
46     bootstrap = -1;\r
47   }\r
48 \r
49   /**\r
50    * Creates a new BinaryNode object.\r
51    * \r
52    * @param val\r
53    *          DOCUMENT ME!\r
54    * @param parent\r
55    *          DOCUMENT ME!\r
56    * @param name\r
57    *          DOCUMENT ME!\r
58    */\r
59   public BinaryNode(Vobject val, BinaryNode parent, String name) {\r
60     this.element = val;\r
61     this.parent = parent;\r
62     this.name = name;\r
63 \r
64     left = right = null;\r
65   }\r
66 \r
67   /**\r
68    * DOCUMENT ME!\r
69    * \r
70    * @return DOCUMENT ME!\r
71    */\r
72   public Vobject element() {\r
73     return element;\r
74   }\r
75 \r
76   /**\r
77    * DOCUMENT ME!\r
78    * \r
79    * @param v\r
80    *          DOCUMENT ME!\r
81    * \r
82    * @return DOCUMENT ME!\r
83    */\r
84   public Vobject setElement(Vobject v) {\r
85     return element = v;\r
86   }\r
87 \r
88   /**\r
89    * DOCUMENT ME!\r
90    * \r
91    * @return DOCUMENT ME!\r
92    */\r
93   public BinaryNode left() {\r
94     return left;\r
95   }\r
96 \r
97   /**\r
98    * DOCUMENT ME!\r
99    * \r
100    * @param n\r
101    *          DOCUMENT ME!\r
102    * \r
103    * @return DOCUMENT ME!\r
104    */\r
105   public BinaryNode setLeft(BinaryNode n) {\r
106     return left = n;\r
107   }\r
108 \r
109   /**\r
110    * DOCUMENT ME!\r
111    * \r
112    * @return DOCUMENT ME!\r
113    */\r
114   public BinaryNode right() {\r
115     return right;\r
116   }\r
117 \r
118   /**\r
119    * DOCUMENT ME!\r
120    * \r
121    * @param n\r
122    *          DOCUMENT ME!\r
123    * \r
124    * @return DOCUMENT ME!\r
125    */\r
126   public BinaryNode setRight(BinaryNode n) {\r
127     return right = n;\r
128   }\r
129 \r
130   /**\r
131    * DOCUMENT ME!\r
132    * \r
133    * @return DOCUMENT ME!\r
134    */\r
135   public BinaryNode parent() {\r
136     return parent;\r
137   }\r
138 \r
139   /**\r
140    * DOCUMENT ME!\r
141    * \r
142    * @param n\r
143    *          DOCUMENT ME!\r
144    * \r
145    * @return DOCUMENT ME!\r
146    */\r
147   public BinaryNode setParent(BinaryNode n) {\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     return (left == null) && (right == null);\r
158   }\r
159 \r
160   /**\r
161    * attaches FIRST and SECOND node arguments as the LEFT and RIGHT children of\r
162    * this node (removing any old references) a null parameter DOES NOT mean that\r
163    * 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     if (leftchild != null) {\r
169       this.setLeft(leftchild);\r
170       leftchild.detach();\r
171       leftchild.setParent(this);\r
172     }\r
173 \r
174     if (rightchild != null) {\r
175       this.setRight(rightchild);\r
176       rightchild.detach();\r
177       rightchild.setParent(this);\r
178     }\r
179   }\r
180 \r
181   /**\r
182    * Detaches the node from the binary tree, along with all its child nodes.\r
183    * \r
184    * @return BinaryNode The detached node.\r
185    */\r
186   public BinaryNode detach() {\r
187     if (this.parent != null) {\r
188       if (this.parent.left == this) {\r
189         this.parent.left = null;\r
190       } else {\r
191         if (this.parent.right == this) {\r
192           this.parent.right = null;\r
193         }\r
194       }\r
195     }\r
196 \r
197     this.parent = null;\r
198 \r
199     return this;\r
200   }\r
201 \r
202   /**\r
203    * Traverses up through the tree until a node with a free leftchild is\r
204    * discovered.\r
205    * \r
206    * @return BinaryNode\r
207    */\r
208   public BinaryNode ascendLeft() {\r
209     BinaryNode c = this;\r
210 \r
211     do {\r
212       c = c.parent();\r
213     } while ((c != null) && (c.left() != null) && !c.left().isLeaf());\r
214 \r
215     return c;\r
216   }\r
217 \r
218   /**\r
219    * Traverses up through the tree until a node with a free rightchild is\r
220    * discovered. Jalview builds trees by descent on the left, so this may be\r
221    * unused.\r
222    * \r
223    * @return BinaryNode\r
224    */\r
225   public BinaryNode ascendRight() {\r
226     BinaryNode c = this;\r
227 \r
228     do {\r
229       c = c.parent();\r
230     } while ((c != null) && (c.right() != null) && !c.right().isLeaf());\r
231 \r
232     return c;\r
233   }\r
234 \r
235   /**\r
236    * DOCUMENT ME!\r
237    * \r
238    * @param name\r
239    *          DOCUMENT ME!\r
240    */\r
241   public void setName(String name) {\r
242     this.name = name;\r
243   }\r
244 \r
245   /**\r
246    * DOCUMENT ME!\r
247    * \r
248    * @return DOCUMENT ME!\r
249    */\r
250   public String getName() {\r
251     return this.name;\r
252   }\r
253 \r
254   /**\r
255    * DOCUMENT ME!\r
256    * \r
257    * @param boot\r
258    *          DOCUMENT ME!\r
259    */\r
260   public void setBootstrap(int boot) {\r
261     this.bootstrap = boot;\r
262   }\r
263 \r
264   /**\r
265    * DOCUMENT ME!\r
266    * \r
267    * @return DOCUMENT ME!\r
268    */\r
269   public int getBootstrap() {\r
270     return bootstrap;\r
271   }\r
272   /**\r
273    * \r
274    * @return unquoted string of form VorbaId|v|node name string public String\r
275    *         getNewickNodeName() { if (element!=null || name!=null) { return\r
276    *         ((element!=null) ? element.getVorbaId().getId()+"|v|" : "") +\r
277    *         ((name == null) ? "" : name); } return ""; }\r
278    * \r
279    *         note we probably don't need this now\r
280    * \r
281    *         public boolean\r
282    *         parseNodeNameString(uk.ac.vamsas.client.ClientDocument binder) {\r
283    * \r
284    *         if (element==null && name!=null && name.indexOf("|v|")>-1) {\r
285    *         element = binder.getObject(null).getVorbaId(); // TODO: fix THIS !\r
286    *         name.substring(0, name.indexOf("|v")));\r
287    * \r
288    *         } return false; }\r
289    */\r
290 }\r