bc417831d28f37d514635bde251d34594c21d59b
[vamsas.git] / src / uk / ac / vamsas / objects / utils / trees / BinaryNode.java
1 /**\r
2  * \r
3  */\r
4 package uk.ac.vamsas.objects.utils.trees;\r
5 \r
6 import uk.ac.vamsas.client.Vobject;\r
7 import uk.ac.vamsas.client.VorbaId;\r
8 \r
9 public class BinaryNode {\r
10   Vobject element;\r
11 \r
12   String name;\r
13 \r
14   BinaryNode left;\r
15 \r
16   BinaryNode right;\r
17 \r
18   BinaryNode parent;\r
19 \r
20   /** bootstrap is non-negative integer */\r
21   public int bootstrap=-1;\r
22 \r
23   /**\r
24    * Creates a new BinaryNode object.\r
25    */\r
26   public BinaryNode() {\r
27     left = right = parent = null;\r
28     bootstrap = -1;\r
29   }\r
30 \r
31   /**\r
32    * Creates a new BinaryNode object.\r
33    * \r
34    * @param val\r
35    *          DOCUMENT ME!\r
36    * @param parent\r
37    *          DOCUMENT ME!\r
38    * @param name\r
39    *          DOCUMENT ME!\r
40    */\r
41   public BinaryNode(Vobject val, BinaryNode parent, String name) {\r
42     this.element = val;\r
43     this.parent = parent;\r
44     this.name = name;\r
45 \r
46     left = right = null;\r
47   }\r
48 \r
49   /**\r
50    * DOCUMENT ME!\r
51    * \r
52    * @return DOCUMENT ME!\r
53    */\r
54   public Vobject element() {\r
55     return element;\r
56   }\r
57 \r
58   /**\r
59    * DOCUMENT ME!\r
60    * \r
61    * @param v\r
62    *          DOCUMENT ME!\r
63    * \r
64    * @return DOCUMENT ME!\r
65    */\r
66   public Vobject setElement(Vobject v) {\r
67     return element = v;\r
68   }\r
69 \r
70   /**\r
71    * DOCUMENT ME!\r
72    * \r
73    * @return DOCUMENT ME!\r
74    */\r
75   public BinaryNode left() {\r
76     return left;\r
77   }\r
78 \r
79   /**\r
80    * DOCUMENT ME!\r
81    * \r
82    * @param n\r
83    *          DOCUMENT ME!\r
84    * \r
85    * @return DOCUMENT ME!\r
86    */\r
87   public BinaryNode setLeft(BinaryNode n) {\r
88     return left = n;\r
89   }\r
90 \r
91   /**\r
92    * DOCUMENT ME!\r
93    * \r
94    * @return DOCUMENT ME!\r
95    */\r
96   public BinaryNode right() {\r
97     return right;\r
98   }\r
99 \r
100   /**\r
101    * DOCUMENT ME!\r
102    * \r
103    * @param n\r
104    *          DOCUMENT ME!\r
105    * \r
106    * @return DOCUMENT ME!\r
107    */\r
108   public BinaryNode setRight(BinaryNode n) {\r
109     return right = n;\r
110   }\r
111 \r
112   /**\r
113    * DOCUMENT ME!\r
114    * \r
115    * @return DOCUMENT ME!\r
116    */\r
117   public BinaryNode parent() {\r
118     return parent;\r
119   }\r
120 \r
121   /**\r
122    * DOCUMENT ME!\r
123    * \r
124    * @param n\r
125    *          DOCUMENT ME!\r
126    * \r
127    * @return DOCUMENT ME!\r
128    */\r
129   public BinaryNode setParent(BinaryNode n) {\r
130     return parent = n;\r
131   }\r
132 \r
133   /**\r
134    * DOCUMENT ME!\r
135    * \r
136    * @return DOCUMENT ME!\r
137    */\r
138   public boolean isLeaf() {\r
139     return (left == null) && (right == null);\r
140   }\r
141 \r
142   /**\r
143    * attaches FIRST and SECOND node arguments as the LEFT and RIGHT children\r
144    * of this node (removing any old references) a null parameter DOES NOT mean\r
145    * that the pointer to the corresponding child node is set to NULL - you\r
146    * should use setChild(null), or detach() for this.\r
147    * \r
148    */\r
149   public void SetChildren(BinaryNode leftchild, BinaryNode rightchild) {\r
150     if (leftchild != null) {\r
151       this.setLeft(leftchild);\r
152       leftchild.detach();\r
153       leftchild.setParent(this);\r
154     }\r
155 \r
156     if (rightchild != null) {\r
157       this.setRight(rightchild);\r
158       rightchild.detach();\r
159       rightchild.setParent(this);\r
160     }\r
161   }\r
162 \r
163   /**\r
164    * Detaches the node from the binary tree, along with all its child nodes.\r
165    * \r
166    * @return BinaryNode The detached node.\r
167    */\r
168   public BinaryNode detach() {\r
169     if (this.parent != null) {\r
170       if (this.parent.left == this) {\r
171         this.parent.left = null;\r
172       } else {\r
173         if (this.parent.right == this) {\r
174           this.parent.right = null;\r
175         }\r
176       }\r
177     }\r
178 \r
179     this.parent = null;\r
180 \r
181     return this;\r
182   }\r
183 \r
184   /**\r
185    * Traverses up through the tree until a node with a free leftchild is\r
186    * discovered.\r
187    * \r
188    * @return BinaryNode\r
189    */\r
190   public BinaryNode ascendLeft() {\r
191     BinaryNode c = this;\r
192 \r
193     do {\r
194       c = c.parent();\r
195     } while ((c != null) && (c.left() != null) && !c.left().isLeaf());\r
196 \r
197     return c;\r
198   }\r
199 \r
200   /**\r
201    * Traverses up through the tree until a node with a free rightchild is\r
202    * discovered. Jalview builds trees by descent on the left, so this may be\r
203    * unused.\r
204    * \r
205    * @return BinaryNode\r
206    */\r
207   public BinaryNode ascendRight() {\r
208     BinaryNode c = this;\r
209 \r
210     do {\r
211       c = c.parent();\r
212     } while ((c != null) && (c.right() != null) && !c.right().isLeaf());\r
213 \r
214     return c;\r
215   }\r
216 \r
217   /**\r
218    * DOCUMENT ME!\r
219    * \r
220    * @param name\r
221    *          DOCUMENT ME!\r
222    */\r
223   public void setName(String name) {\r
224     this.name = name;\r
225   }\r
226 \r
227   /**\r
228    * DOCUMENT ME!\r
229    * \r
230    * @return DOCUMENT ME!\r
231    */\r
232   public String getName() {\r
233     return this.name;\r
234   }\r
235 \r
236   /**\r
237    * DOCUMENT ME!\r
238    * \r
239    * @param boot\r
240    *          DOCUMENT ME!\r
241    */\r
242   public void setBootstrap(int boot) {\r
243     this.bootstrap = boot;\r
244   }\r
245 \r
246   /**\r
247    * DOCUMENT ME!\r
248    * \r
249    * @return DOCUMENT ME!\r
250    */\r
251   public int getBootstrap() {\r
252     return bootstrap;\r
253   }\r
254   /**\r
255    * \r
256    * @return unquoted string of form VorbaId|v|node name string\r
257   public String getNewickNodeName() {\r
258     if (element!=null || name!=null)\r
259       {\r
260       return ((element!=null) ? element.getVorbaId().getId()+"|v|" : "")\r
261         + ((name == null) ? "" : name);\r
262       }\r
263     return "";\r
264   }\r
265   \r
266    * note we probably don't need this now\r
267 \r
268    * public boolean parseNodeNameString(uk.ac.vamsas.client.ClientDocument binder)\r
269   {\r
270     \r
271     if (element==null && name!=null && name.indexOf("|v|")>-1)\r
272     {\r
273       element = binder.getObject(null).getVorbaId(); // TODO: fix THIS ! name.substring(0, name.indexOf("|v")));\r
274       \r
275     }\r
276     return false;\r
277   }*/\r
278 }