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

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

Further code cleanup

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