source: branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/pal/tree/SimpleTree.java @ 1579

Last change on this file since 1579 was 1579, checked in by rkrimmel, 10 years ago

Code cleanup, removed alot of unneccessary code from pal sources

File size: 3.8 KB
Line 
1// SimpleTree.java
2//
3// (c) 1999-2001 PAL Development Core Team
4//
5// This package may be distributed under the
6// terms of the Lesser GNU General Public License (LGPL)
7
8
9package de.ugoe.cs.autoquest.tasktrees.alignment.pal.tree;
10
11import java.io.PrintWriter;
12import java.io.StringWriter;
13
14
15import de.ugoe.cs.autoquest.tasktrees.alignment.pal.misc.Identifier;
16
17
18
19
20/**
21 * data structure for a binary/non-binary rooted/unrooted trees
22 *
23 * @version $Id: SimpleTree.java,v 1.19 2002/01/13 23:13:24 matt Exp $
24 *
25 * @author Alexei Drummond
26 * @author Korbinian Strimmer
27 *
28 */
29public class SimpleTree implements Tree
30{
31        //
32        // This class has explicit serialization code so if you alter any fields please alter
33        // the serialization code too (make sure you use a new version number - see readObject/writeObject
34        // Thanks, Matthew
35
36        //
37        // Public stuff
38        //
39
40        //
41        // Private stuff
42        /** root node */
43        private Node root;
44
45        /** list of internal nodes (including root) */
46        private Node[] internalNode = null;
47
48        /** number of internal nodes (including root) */
49        private int numInternalNodes;
50
51        /** list of external nodes */
52        private Node[] externalNode = null;
53
54        /** number of external nodes */
55        private int numExternalNodes;
56
57        /** constructor tree consisting solely of root node */
58        public SimpleTree() {
59
60                // Default configuration
61                root = new FengDoolittleNode();
62                root.setIdentifier(new Identifier("ROOT"));
63                root.setBranchLength(0.0);
64                root.setBranchLengthSE(0.0);
65        }
66
67        /** constructor taking a root node */
68        public SimpleTree(Node r) {
69
70                root = r;
71                createNodeList();
72        }
73
74
75        /**
76         * Returns the number of external nodes.
77         */
78        public final int getExternalNodeCount() {
79                if(externalNode==null) {
80                        createNodeList();
81                }
82                return numExternalNodes;
83        }
84
85        /**
86         * Returns the ith external node.
87         */
88        public final Node getExternalNode(int i) {
89                if(externalNode==null) {
90                        createNodeList();
91                }
92                return externalNode[i];
93        }
94
95        /**
96         * Returns the number of internal nodes.
97         */
98        public final int getInternalNodeCount() {
99                if(internalNode==null) {
100                        createNodeList();
101                }
102                return numInternalNodes;
103        }
104
105        /**
106         * Returns the ith internal node.
107         */
108        public final Node getInternalNode(int i) {
109                if(internalNode==null) {
110                        createNodeList();
111                }
112                return internalNode[i];
113        }
114
115        /**
116         * Returns the root node of this tree.
117         */
118        public final Node getRoot() {
119                return root;
120        }
121
122        /**
123         * Set a new node as root node.
124         */
125        public final void setRoot(Node r) {
126                root = r;
127                createNodeList();
128        }
129
130        /** count and list external and internal nodes and
131                compute heights of each node */
132        public void createNodeList()
133        {
134                numInternalNodes = 0;
135                numExternalNodes = 0;
136                Node node = root;
137                do
138                {
139                        node = NodeUtils.postorderSuccessor(node);
140                        if (node.isLeaf())
141                        {
142                                node.setNumber(numExternalNodes);
143                                numExternalNodes++;
144                        }
145                        else
146                        {
147                                node.setNumber(numInternalNodes);
148                                numInternalNodes++;
149                        }
150                }
151                while(node != root);
152
153                internalNode = new Node[numInternalNodes];
154                externalNode = new Node[numExternalNodes];
155                node = root;
156                do
157                {
158                        node = NodeUtils.postorderSuccessor(node);
159                        if (node.isLeaf())
160                        {
161                                externalNode[node.getNumber()] = node;
162                        }
163                        else
164                        {
165                                internalNode[node.getNumber()] = node;
166                        }
167                }
168                while(node != root);
169
170                // compute heights if it seems necessary
171                if (root.getNodeHeight() == 0.0) {
172                        NodeUtils.lengths2Heights(root);
173                }
174        }
175
176        /**
177         * return node with number num (as displayed in ASCII tree)
178         *
179         * @param num number of node
180         *
181         * @return node
182         */
183        public Node findNode(int num)
184        {
185                createNodeList();
186
187                if (num <= numExternalNodes)
188                {
189                        return externalNode[num-1];
190                }
191                else
192                {
193                        return internalNode[num-1-numExternalNodes];
194                }
195        }
196
197
198
199
200        public String toString() {
201                StringWriter sw = new StringWriter();
202                NodeUtils.printNH(new PrintWriter(sw), getRoot(), false, true, 0, true);
203                sw.write(";");
204                return sw.toString();
205        }
206
207
208
209
210
211
212}
Note: See TracBrowser for help on using the repository browser.