<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FCollections_Data_Structure%2FTree</id>
		<title>Java/Collections Data Structure/Tree - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FCollections_Data_Structure%2FTree"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Collections_Data_Structure/Tree&amp;action=history"/>
		<updated>2026-04-22T04:34:31Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Collections_Data_Structure/Tree&amp;diff=9113&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Collections_Data_Structure/Tree&amp;diff=9113&amp;oldid=prev"/>
				<updated>2010-06-01T07:25:27Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 07:25, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Collections_Data_Structure/Tree&amp;diff=9112&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Collections_Data_Structure/Tree&amp;diff=9112&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:48Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== A tree structure that maps inheritance hierarchies of classes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
/*&lt;br /&gt;
 * The contents of this file are subject to the Sapient Public License&lt;br /&gt;
 * Version 1.0 (the &amp;quot;License&amp;quot;); you may not use this file except in compliance&lt;br /&gt;
 * with the License. You may obtain a copy of the License at&lt;br /&gt;
 * http://carbon.sf.net/License.html.&lt;br /&gt;
 *&lt;br /&gt;
 * Software distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; basis,&lt;br /&gt;
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for&lt;br /&gt;
 * the specific language governing rights and limitations under the License.&lt;br /&gt;
 *&lt;br /&gt;
 * The Original Code is The Carbon Component Framework.&lt;br /&gt;
 *&lt;br /&gt;
 * The Initial Developer of the Original Code is Sapient Corporation&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright (C) 2003 Sapient Corporation. All Rights Reserved.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collections;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;lt;p&amp;gt;This class creates a tree structure that maps inheritance hierarchies of&lt;br /&gt;
 * classes. A developer can place any number of classes into this object and&lt;br /&gt;
 * retrieve the closest super class or the class itself.&amp;lt;/p&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2001 Sapient&lt;br /&gt;
 * @since EJFW 2.7&lt;br /&gt;
 * @author Greg Hinkle, January 2001&lt;br /&gt;
 * @version $Revision: 1.4 $($Author: dvoet $ / $Date: 2003/05/05 21:21:23 $)&lt;br /&gt;
 */&lt;br /&gt;
public class ClassTree {&lt;br /&gt;
    protected ClassTreeNode bottom;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructs a ClassTree that represents all classes and interfaces that&lt;br /&gt;
     * are generalizations of the provided class. This ends up with a tree&lt;br /&gt;
     * structure of the inheritance hierarchy for that provided class all the&lt;br /&gt;
     * way up to java.lang.Object.&lt;br /&gt;
     * @param specificClass The class to build the tree for.&lt;br /&gt;
     */&lt;br /&gt;
    public ClassTree(Class specificClass) {&lt;br /&gt;
        this.bottom = ClassTreeNode.buildNode(specificClass);&lt;br /&gt;
    }&lt;br /&gt;
    public ClassTreeNode getBottom() {&lt;br /&gt;
        return this.bottom;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructs an ordered list starting at the highest (most general) class&lt;br /&gt;
     * in the tree and moving down the tree, ensuring no generalization comes&lt;br /&gt;
     * after one of its specializations.&lt;br /&gt;
     * @return a list ordered as above&lt;br /&gt;
     */&lt;br /&gt;
    public List getOrderedList() {&lt;br /&gt;
        List list = new ArrayList();&lt;br /&gt;
        list.add(getBottom());&lt;br /&gt;
        buildList(getBottom(),list);&lt;br /&gt;
        Collections.sort(list);&lt;br /&gt;
        // Refactor list into a list of classes from a list of ClassTreeNodes&lt;br /&gt;
        for (int i = 0; i &amp;lt; list.size(); i++) {&lt;br /&gt;
            ClassTreeNode node = (ClassTreeNode) list.get(i);&lt;br /&gt;
            list.set(i,node.getObjectClass());&lt;br /&gt;
        }&lt;br /&gt;
        // Reverse the list so that the top class in the hierarchy comes first&lt;br /&gt;
        Collections.reverse(list);&lt;br /&gt;
        return list;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * &amp;lt;p&amp;gt;Build breadth first in order to maintain sudo ordering as per&lt;br /&gt;
     * class declarations (i.e. if A implements B, C... B is closer in the&lt;br /&gt;
     * chain to A than C is, because B comes first in the implements clause.&amp;lt;/p&amp;gt;&lt;br /&gt;
     *&lt;br /&gt;
     * &amp;lt;p&amp;gt;Note that the list coming out here is preordered, but not natural&lt;br /&gt;
     * ordered. (i.e. some classes are out of order in relation to classes&lt;br /&gt;
     * they have direct relationships with. This is later fixed by a sort&lt;br /&gt;
     * on the list by natural ordering. Collecitons.sort, does preserve&lt;br /&gt;
     * the preordering for nodes that have no relationship.&amp;lt;/p&amp;gt;&lt;br /&gt;
     *&lt;br /&gt;
     * @param node the node to be browsed.&lt;br /&gt;
     * @param output this list is altered to add the contents as they are&lt;br /&gt;
     *   browsed in breadth-first order. Start with a list containing only&lt;br /&gt;
     *   the bottom node.&lt;br /&gt;
     */&lt;br /&gt;
    private void buildList(ClassTreeNode node, List output) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; node.getParents().size(); i++) {&lt;br /&gt;
            ClassTreeNode parent = (ClassTreeNode) node.getParents().get(i);&lt;br /&gt;
            if (!output.contains(parent)) {&lt;br /&gt;
                output.add(parent);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        List parents = node.getParents();&lt;br /&gt;
        for (int i = 0; i &amp;lt; parents.size(); i++) {&lt;br /&gt;
            ClassTreeNode parent = (ClassTreeNode) parents.get(i);&lt;br /&gt;
            buildList(parent, output);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * &amp;lt;p&amp;gt;Inner class representing each node in the tree. Holds references to the&lt;br /&gt;
     * nodes children, parent and provides the Comparable interface for sorting&lt;br /&gt;
     * by inheritance hierarchy.&amp;lt;/p&amp;gt;&lt;br /&gt;
     */&lt;br /&gt;
    public static class ClassTreeNode implements Comparable {&lt;br /&gt;
        /** The class of this node */&lt;br /&gt;
        protected Class objectClass;&lt;br /&gt;
        /** The map of children classes to their class names */&lt;br /&gt;
        protected List children;&lt;br /&gt;
        /** A reference to the parent node of this node */&lt;br /&gt;
        protected List parents;&lt;br /&gt;
        /**&lt;br /&gt;
         * &amp;lt;p&amp;gt;Constructs a ClassTreeNode with the given Class.&amp;lt;/p&amp;gt;&lt;br /&gt;
         *&lt;br /&gt;
         * @param objectClass the Class of the node&lt;br /&gt;
         */&lt;br /&gt;
        public ClassTreeNode(Class objectClass) {&lt;br /&gt;
            this.children = new ArrayList();&lt;br /&gt;
            this.objectClass = objectClass;&lt;br /&gt;
            this.parents = new ArrayList();&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        public static ClassTreeNode buildNode(Class objectClass) {&lt;br /&gt;
            Map allNodes = new HashMap();&lt;br /&gt;
            return buildNode(objectClass, allNodes);&lt;br /&gt;
        }&lt;br /&gt;
        protected static ClassTreeNode buildNode(Class objectClass, Map allNodes) {&lt;br /&gt;
            ClassTreeNode node;&lt;br /&gt;
            if (allNodes.containsKey(objectClass)) {&lt;br /&gt;
                node = (ClassTreeNode) allNodes.get(objectClass);&lt;br /&gt;
            } else {&lt;br /&gt;
                node = new ClassTreeNode(objectClass);&lt;br /&gt;
                allNodes.put(objectClass, node);&lt;br /&gt;
            }&lt;br /&gt;
            // Add the implemented interfaces...&lt;br /&gt;
            Class[] superInterfaces = objectClass.getInterfaces();&lt;br /&gt;
            for (int i = 0; i &amp;lt; superInterfaces.length; i++) {&lt;br /&gt;
                Class superInterface = superInterfaces[i];&lt;br /&gt;
                ClassTreeNode parent = buildNode(superInterface);&lt;br /&gt;
                node.addParent(parent);&lt;br /&gt;
            }&lt;br /&gt;
            // Add the superclass after the interfaces...&lt;br /&gt;
            Class superClass = objectClass.getSuperclass();&lt;br /&gt;
            if (superClass != null) {&lt;br /&gt;
                ClassTreeNode parent = buildNode(superClass);&lt;br /&gt;
                node.addParent(parent);&lt;br /&gt;
            }&lt;br /&gt;
            return node;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public List getParents() {&lt;br /&gt;
            return this.parents;&lt;br /&gt;
        }&lt;br /&gt;
        public void addParent(ClassTreeNode node) {&lt;br /&gt;
            this.parents.add(node);&lt;br /&gt;
            node.addChild(this);&lt;br /&gt;
        }&lt;br /&gt;
        public boolean removeChild(ClassTreeNode node) {&lt;br /&gt;
            return this.children.remove(node);&lt;br /&gt;
        }&lt;br /&gt;
        public void addChild(ClassTreeNode node) {&lt;br /&gt;
            this.children.add(node);&lt;br /&gt;
        }&lt;br /&gt;
        public List getChildren() {&lt;br /&gt;
            return this.children;&lt;br /&gt;
        }&lt;br /&gt;
        public boolean equals(Object obj) {&lt;br /&gt;
            return ((ClassTreeNode)obj).getObjectClass().equals(this.objectClass);&lt;br /&gt;
        }&lt;br /&gt;
        public Class getObjectClass() {&lt;br /&gt;
            return this.objectClass;&lt;br /&gt;
        }&lt;br /&gt;
        public String getClassName() {&lt;br /&gt;
            return this.objectClass.getName();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public int hashCode() {&lt;br /&gt;
            return this.objectClass.hashCode();&lt;br /&gt;
        }&lt;br /&gt;
        /**&lt;br /&gt;
         * &amp;lt;p&amp;gt;Compares one class to another class by their inheritance tree.&amp;lt;/p&amp;gt;&lt;br /&gt;
         *&lt;br /&gt;
         * @return an integer representing the comparison results as follows:&amp;lt;br&amp;gt;&lt;br /&gt;
         *    2  if this is a subclass of past in object&amp;lt;br&amp;gt;&lt;br /&gt;
         *    -2 if this is a superclass of past in object&amp;lt;br&amp;gt;&lt;br /&gt;
         *    0 if they are not related (and in relation to sorting, equal)&amp;lt;br&amp;gt;&lt;br /&gt;
         *    0  if they are the same&amp;lt;br&amp;gt;&lt;br /&gt;
         */&lt;br /&gt;
        public int compareTo(Object obj) {&lt;br /&gt;
            Class objClass = ((ClassTreeNode)obj).getObjectClass();&lt;br /&gt;
            if (objClass.equals(this.objectClass)) {&lt;br /&gt;
                return 0;&lt;br /&gt;
            } else if (this.objectClass.isAssignableFrom(objClass)) {&lt;br /&gt;
                return 2;&lt;br /&gt;
            } else if (objClass.isAssignableFrom(this.objectClass)) {&lt;br /&gt;
                return -2;&lt;br /&gt;
            } else {&lt;br /&gt;
                return 0;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    } // End of ClassTree$ClassTreeNode&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Binary Tree ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
       /*&lt;br /&gt;
DEVELOPING GAME IN JAVA &lt;br /&gt;
Caracteristiques&lt;br /&gt;
Editeur : NEW RIDERS &lt;br /&gt;
Auteur : BRACKEEN &lt;br /&gt;
Parution : 09 2003 &lt;br /&gt;
Pages : 972 &lt;br /&gt;
Isbn : 1-59273-005-1 &lt;br /&gt;
Reliure : Paperback &lt;br /&gt;
Disponibilite : Disponible a la librairie &lt;br /&gt;
*/&lt;br /&gt;
public class BinaryTreeTest {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    new BinaryTreeTest().run();&lt;br /&gt;
  }&lt;br /&gt;
  static class Node {&lt;br /&gt;
    Node left;&lt;br /&gt;
    Node right;&lt;br /&gt;
    int value;&lt;br /&gt;
    public Node(int value) {&lt;br /&gt;
      this.value = value;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    // build the simple tree from chapter 11.&lt;br /&gt;
    Node root = new Node(5);&lt;br /&gt;
    System.out.println(&amp;quot;Binary Tree Example&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;Building tree with root value &amp;quot; + root.value);&lt;br /&gt;
    insert(root, 1);&lt;br /&gt;
    insert(root, 8);&lt;br /&gt;
    insert(root, 6);&lt;br /&gt;
    insert(root, 3);&lt;br /&gt;
    insert(root, 9);&lt;br /&gt;
    System.out.println(&amp;quot;Traversing tree in order&amp;quot;);&lt;br /&gt;
    printInOrder(root);&lt;br /&gt;
    System.out.println(&amp;quot;Traversing tree front-to-back from location 7&amp;quot;);&lt;br /&gt;
    printFrontToBack(root, 7);&lt;br /&gt;
  }&lt;br /&gt;
  public void insert(Node node, int value) {&lt;br /&gt;
    if (value &amp;lt; node.value) {&lt;br /&gt;
      if (node.left != null) {&lt;br /&gt;
        insert(node.left, value);&lt;br /&gt;
      } else {&lt;br /&gt;
        System.out.println(&amp;quot;  Inserted &amp;quot; + value + &amp;quot; to left of &amp;quot;&lt;br /&gt;
            + node.value);&lt;br /&gt;
        node.left = new Node(value);&lt;br /&gt;
      }&lt;br /&gt;
    } else if (value &amp;gt; node.value) {&lt;br /&gt;
      if (node.right != null) {&lt;br /&gt;
        insert(node.right, value);&lt;br /&gt;
      } else {&lt;br /&gt;
        System.out.println(&amp;quot;  Inserted &amp;quot; + value + &amp;quot; to right of &amp;quot;&lt;br /&gt;
            + node.value);&lt;br /&gt;
        node.right = new Node(value);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void printInOrder(Node node) {&lt;br /&gt;
    if (node != null) {&lt;br /&gt;
      printInOrder(node.left);&lt;br /&gt;
      System.out.println(&amp;quot;  Traversed &amp;quot; + node.value);&lt;br /&gt;
      printInOrder(node.right);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * uses in-order traversal when the origin is less than the node&amp;quot;s value&lt;br /&gt;
   * &lt;br /&gt;
   * uses reverse-order traversal when the origin is greater than the node&amp;quot;s&lt;br /&gt;
   * order&lt;br /&gt;
   */&lt;br /&gt;
  public void printFrontToBack(Node node, int camera) {&lt;br /&gt;
    if (node == null)&lt;br /&gt;
      return;&lt;br /&gt;
    if (node.value &amp;gt; camera) {&lt;br /&gt;
      // print in order&lt;br /&gt;
      printFrontToBack(node.left, camera);&lt;br /&gt;
      System.out.println(&amp;quot;  Traversed &amp;quot; + node.value);&lt;br /&gt;
      printFrontToBack(node.right, camera);&lt;br /&gt;
    } else if (node.value &amp;lt; camera) {&lt;br /&gt;
      // print reverse order&lt;br /&gt;
      printFrontToBack(node.right, camera);&lt;br /&gt;
      System.out.println(&amp;quot;  Traversed &amp;quot; + node.value);&lt;br /&gt;
      printFrontToBack(node.left, camera);&lt;br /&gt;
    } else {&lt;br /&gt;
      // order doesn&amp;quot;t matter&lt;br /&gt;
      printFrontToBack(node.left, camera);&lt;br /&gt;
      printFrontToBack(node.right, camera);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data structure that mantains data in a ordered binary tree; each node is greater (smaller) or equal than its 2 sub-nodes, for all the hierarchy. ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
/*&lt;br /&gt;
 * JBoss, Home of Professional Open Source&lt;br /&gt;
 * Copyright 2005, JBoss Inc., and individual contributors as indicated&lt;br /&gt;
 * by the @authors tag. See the copyright.txt in the distribution for a&lt;br /&gt;
 * full listing of individual contributors.&lt;br /&gt;
 *&lt;br /&gt;
 * This is free software; you can redistribute it and/or modify it&lt;br /&gt;
 * under the terms of the GNU Lesser General Public License as&lt;br /&gt;
 * published by the Free Software Foundation; either version 2.1 of&lt;br /&gt;
 * the License, or (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 * This software is distributed in the hope that it will be useful,&lt;br /&gt;
 * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU&lt;br /&gt;
 * Lesser General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * You should have received a copy of the GNU Lesser General Public&lt;br /&gt;
 * License along with this software; if not, write to the Free&lt;br /&gt;
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA&lt;br /&gt;
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.&lt;br /&gt;
 */&lt;br /&gt;
import java.util.ruparator;&lt;br /&gt;
/**&lt;br /&gt;
 * Data structure that mantains data in a ordered binary tree; each node is&lt;br /&gt;
 * greater (smaller) or equal than its 2 sub-nodes, for all the hierarchy.&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * Elements of this data structure should either implement Comparable, or a&lt;br /&gt;
 * Comparator should be given as argument to the constructor.&lt;br /&gt;
 * &lt;br /&gt;
 * @author &lt;br /&gt;
 * @version $Revision: 2787 $&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings(&amp;quot;unchecked&amp;quot;)&lt;br /&gt;
public class Heap {&lt;br /&gt;
  private Comparator m_comparator;&lt;br /&gt;
  private int m_count;&lt;br /&gt;
  private Object[] m_nodes;&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new Heap whose elements inserted implement the {@link Comparable}&lt;br /&gt;
   * interface.&lt;br /&gt;
   */&lt;br /&gt;
  public Heap() {&lt;br /&gt;
    this(null);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new Heap whose elements are compared using the given&lt;br /&gt;
   * {@link Comparator}.&lt;br /&gt;
   * &lt;br /&gt;
   * @param comparator&lt;br /&gt;
   */&lt;br /&gt;
  public Heap(Comparator comparator) {&lt;br /&gt;
    m_comparator = comparator;&lt;br /&gt;
    clear();&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Inserts the given element in this heap.&lt;br /&gt;
   * &lt;br /&gt;
   * @param obj&lt;br /&gt;
   * &lt;br /&gt;
   * @see #extract&lt;br /&gt;
   */&lt;br /&gt;
  public void insert(Object obj) {&lt;br /&gt;
    int length = m_nodes.length;&lt;br /&gt;
    // Expand if necessary&lt;br /&gt;
    if (m_count == length) {&lt;br /&gt;
      Object[] newNodes = new Object[length + length];&lt;br /&gt;
      System.arraycopy(m_nodes, 0, newNodes, 0, length);&lt;br /&gt;
      m_nodes = newNodes;&lt;br /&gt;
    }&lt;br /&gt;
    // Be cur_slot the first unused slot index; be par_slot its parent index.&lt;br /&gt;
    // Start from cur_slot and walk up the tree comparing the object to&lt;br /&gt;
    // insert with the object at par_slot; if it&amp;quot;s smaller move down the object&lt;br /&gt;
    // at par_slot,&lt;br /&gt;
    // otherwise cur_slot is the index where insert the object. If not done,&lt;br /&gt;
    // shift up the tree so that now cur_slot is the old par_slot and&lt;br /&gt;
    // par_slot is the parent index of the new cur_slot (so the grand-parent&lt;br /&gt;
    // index of the old cur_slot) and compare again.&lt;br /&gt;
    int k = m_count;&lt;br /&gt;
    while (k &amp;gt; 0) {&lt;br /&gt;
      int par = parent(k);&lt;br /&gt;
      if (compare(obj, m_nodes[par]) &amp;lt; 0) {&lt;br /&gt;
        m_nodes[k] = m_nodes[par];&lt;br /&gt;
        k = par;&lt;br /&gt;
      } else&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
    m_nodes[k] = obj;&lt;br /&gt;
    ++m_count;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Removes and returns the least element of this heap.&lt;br /&gt;
   * &lt;br /&gt;
   * @return the extracted object&lt;br /&gt;
   * &lt;br /&gt;
   * @see #insert&lt;br /&gt;
   * @see #peek&lt;br /&gt;
   */&lt;br /&gt;
  public Object extract() {&lt;br /&gt;
    if (m_count &amp;lt; 1) {&lt;br /&gt;
      return null;&lt;br /&gt;
    } else {&lt;br /&gt;
      int length = m_nodes.length &amp;gt;&amp;gt; 1;&lt;br /&gt;
      // Shrink if necessary&lt;br /&gt;
      if (length &amp;gt; 5 &amp;amp;&amp;amp; m_count &amp;lt; (length &amp;gt;&amp;gt; 1)) {&lt;br /&gt;
        Object[] newNodes = new Object[length];&lt;br /&gt;
        System.arraycopy(m_nodes, 0, newNodes, 0, length);&lt;br /&gt;
        m_nodes = newNodes;&lt;br /&gt;
      }&lt;br /&gt;
      //&lt;br /&gt;
      int k = 0;&lt;br /&gt;
      Object ret = m_nodes[k];&lt;br /&gt;
      --m_count;&lt;br /&gt;
      Object last = m_nodes[m_count];&lt;br /&gt;
      for (;;) {&lt;br /&gt;
        int l = left(k);&lt;br /&gt;
        if (l &amp;gt;= m_count) {&lt;br /&gt;
          break;&lt;br /&gt;
        } else {&lt;br /&gt;
          int r = right(k);&lt;br /&gt;
          int child = (r &amp;gt;= m_count || compare(m_nodes[l], m_nodes[r]) &amp;lt; 0) ? l : r;&lt;br /&gt;
          if (compare(last, m_nodes[child]) &amp;gt; 0) {&lt;br /&gt;
            m_nodes[k] = m_nodes[child];&lt;br /&gt;
            k = child;&lt;br /&gt;
          } else {&lt;br /&gt;
            break;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      m_nodes[k] = last;&lt;br /&gt;
      m_nodes[m_count] = null;&lt;br /&gt;
      return ret;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * @return without removing it, the least element of this heap.&lt;br /&gt;
   * &lt;br /&gt;
   * @see #extract&lt;br /&gt;
   */&lt;br /&gt;
  public Object peek() {&lt;br /&gt;
    if (m_count &amp;lt; 1) {&lt;br /&gt;
      return null;&lt;br /&gt;
    } else {&lt;br /&gt;
      return m_nodes[0];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Empties this heap&lt;br /&gt;
   */&lt;br /&gt;
  public void clear() {&lt;br /&gt;
    m_count = 0;&lt;br /&gt;
    m_nodes = new Object[10];&lt;br /&gt;
  }&lt;br /&gt;
  protected int compare(Object o1, Object o2) {&lt;br /&gt;
    if (m_comparator != null) {&lt;br /&gt;
      return m_comparator.rupare(o1, o2);&lt;br /&gt;
    } else {&lt;br /&gt;
      if (o1 == null) {&lt;br /&gt;
        if (o2 == null) {&lt;br /&gt;
          return 0;&lt;br /&gt;
        } else {&lt;br /&gt;
          return -((Comparable) o2).rupareTo(o1);&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        return ((Comparable) o1).rupareTo(o2);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * @return the parent index of &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;.&lt;br /&gt;
   * @param index&lt;br /&gt;
   */&lt;br /&gt;
  protected int parent(int index) {&lt;br /&gt;
    return (index - 1) &amp;gt;&amp;gt; 1;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * @param index&lt;br /&gt;
   * @return the left child index of &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;.&lt;br /&gt;
   */&lt;br /&gt;
  protected int left(int index) {&lt;br /&gt;
    return index + index + 1;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * @param index&lt;br /&gt;
   * @return the right child index of &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;.&lt;br /&gt;
   */&lt;br /&gt;
  protected int right(int index) {&lt;br /&gt;
    return index + index + 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tree Node for the for a general tree of Objects ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
/*&lt;br /&gt;
 * &lt;br /&gt;
 * This software is subject to the terms of the Common Public License&lt;br /&gt;
 * Agreement, available at the following URL:&lt;br /&gt;
 *   http://www.opensource.org/licenses/cpl.html .&lt;br /&gt;
 * Copyright (C) 2003-2004 TONBELLER AG.&lt;br /&gt;
 * All Rights Reserved.&lt;br /&gt;
 * You must accept the terms of that agreement to use this software.&lt;br /&gt;
 * &lt;br /&gt;
 *&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
/**&lt;br /&gt;
 * Tree Node for the for a general tree of Objects&lt;br /&gt;
 */&lt;br /&gt;
public class TreeNode {&lt;br /&gt;
  private TreeNode parent = null;&lt;br /&gt;
  private List children = null;&lt;br /&gt;
  private Object reference;&lt;br /&gt;
  /**&lt;br /&gt;
   * cTtor&lt;br /&gt;
   * @param obj referenced object&lt;br /&gt;
   */&lt;br /&gt;
  public TreeNode(Object obj) {&lt;br /&gt;
    this.parent = null;&lt;br /&gt;
    this.reference = obj;&lt;br /&gt;
    this.children = new ArrayList();&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * remove node from tree&lt;br /&gt;
   */&lt;br /&gt;
  public void remove() {&lt;br /&gt;
    if (parent != null) {&lt;br /&gt;
      parent.removeChild(this);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * remove child node&lt;br /&gt;
   * @param child&lt;br /&gt;
   */&lt;br /&gt;
  private void removeChild(TreeNode child) {&lt;br /&gt;
    if (children.contains(child))&lt;br /&gt;
      children.remove(child);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * add child node&lt;br /&gt;
   * @param child node to be added&lt;br /&gt;
   */&lt;br /&gt;
  public void addChildNode(TreeNode child) {&lt;br /&gt;
    child.parent = this;&lt;br /&gt;
    if (!children.contains(child))&lt;br /&gt;
      children.add(child);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * deep copy (clone)&lt;br /&gt;
   * @return copy of TreeNode&lt;br /&gt;
   */&lt;br /&gt;
  public TreeNode deepCopy() {&lt;br /&gt;
    TreeNode newNode = new TreeNode(reference);&lt;br /&gt;
    for (Iterator iter = children.iterator(); iter.hasNext();) {&lt;br /&gt;
      TreeNode child = (TreeNode) iter.next();&lt;br /&gt;
      newNode.addChildNode(child.deepCopy());&lt;br /&gt;
    }&lt;br /&gt;
    return newNode;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * deep copy (clone) and prune &lt;br /&gt;
   * @param depth - number of child levels to be copied&lt;br /&gt;
   * @return copy of TreeNode&lt;br /&gt;
   */&lt;br /&gt;
  public TreeNode deepCopyPrune(int depth) {&lt;br /&gt;
    if (depth &amp;lt; 0)&lt;br /&gt;
      throw new IllegalArgumentException(&amp;quot;Depth is negative&amp;quot;);&lt;br /&gt;
    TreeNode newNode = new TreeNode(reference);&lt;br /&gt;
    if (depth == 0)&lt;br /&gt;
      return newNode;&lt;br /&gt;
    for (Iterator iter = children.iterator(); iter.hasNext();) {&lt;br /&gt;
      TreeNode child = (TreeNode) iter.next();&lt;br /&gt;
      newNode.addChildNode(child.deepCopyPrune(depth - 1));&lt;br /&gt;
    }&lt;br /&gt;
    return newNode;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * @return level = distance from root&lt;br /&gt;
   */&lt;br /&gt;
  public int getLevel() {&lt;br /&gt;
    int level = 0;&lt;br /&gt;
    TreeNode p = parent;&lt;br /&gt;
    while (p != null) {&lt;br /&gt;
      ++level;&lt;br /&gt;
      p = p.parent;&lt;br /&gt;
    }&lt;br /&gt;
    return level;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * walk through subtree of this node&lt;br /&gt;
   * @param callbackHandler function called on iteration &lt;br /&gt;
   */&lt;br /&gt;
  public int walkTree(TreeNodeCallback callbackHandler) {&lt;br /&gt;
    int code = 0;&lt;br /&gt;
    code = callbackHandler.handleTreeNode(this);&lt;br /&gt;
    if (code != TreeNodeCallback.CONTINUE)&lt;br /&gt;
      return code;&lt;br /&gt;
    ChildLoop: for (Iterator iter = children.iterator(); iter.hasNext();) {&lt;br /&gt;
      TreeNode child = (TreeNode) iter.next();&lt;br /&gt;
      code = child.walkTree(callbackHandler);&lt;br /&gt;
      if (code &amp;gt;= TreeNodeCallback.CONTINUE_PARENT)&lt;br /&gt;
        return code;&lt;br /&gt;
    }&lt;br /&gt;
    return code;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * walk through children subtrees of this node&lt;br /&gt;
   * @param callbackHandler function called on iteration &lt;br /&gt;
   */&lt;br /&gt;
  public int walkChildren(TreeNodeCallback callbackHandler) {&lt;br /&gt;
    int code = 0;&lt;br /&gt;
    ChildLoop: for (Iterator iter = children.iterator(); iter.hasNext();) {&lt;br /&gt;
      TreeNode child = (TreeNode) iter.next();&lt;br /&gt;
      code = callbackHandler.handleTreeNode(child);&lt;br /&gt;
      if (code &amp;gt;= TreeNodeCallback.CONTINUE_PARENT)&lt;br /&gt;
        return code;&lt;br /&gt;
      if (code == TreeNodeCallback.CONTINUE) {&lt;br /&gt;
        code = child.walkChildren(callbackHandler);&lt;br /&gt;
        if (code &amp;gt; TreeNodeCallback.CONTINUE_PARENT)&lt;br /&gt;
          return code;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return code;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * @return List of children&lt;br /&gt;
   */&lt;br /&gt;
  public List getChildren() {&lt;br /&gt;
    return children;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * @return parent node&lt;br /&gt;
   */&lt;br /&gt;
  public TreeNode getParent() {&lt;br /&gt;
    return parent;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * @return reference object&lt;br /&gt;
   */&lt;br /&gt;
  public Object getReference() {&lt;br /&gt;
    return reference;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * set reference object&lt;br /&gt;
   * @param object reference&lt;br /&gt;
   */&lt;br /&gt;
  public void setReference(Object object) {&lt;br /&gt;
    reference = object;&lt;br /&gt;
  }&lt;br /&gt;
} // TreeNode&lt;br /&gt;
/*&lt;br /&gt;
 * &lt;br /&gt;
 * This software is subject to the terms of the Common Public License&lt;br /&gt;
 * Agreement, available at the following URL:&lt;br /&gt;
 *   http://www.opensource.org/licenses/cpl.html .&lt;br /&gt;
 * Copyright (C) 2003-2004 TONBELLER AG.&lt;br /&gt;
 * All Rights Reserved.&lt;br /&gt;
 * You must accept the terms of that agreement to use this software.&lt;br /&gt;
 * &lt;br /&gt;
 *&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 * handle call back for position tree&lt;br /&gt;
 */&lt;br /&gt;
interface TreeNodeCallback {&lt;br /&gt;
  public static final int CONTINUE = 0;&lt;br /&gt;
  public static final int CONTINUE_SIBLING = 1;&lt;br /&gt;
  public static final int CONTINUE_PARENT = 2;&lt;br /&gt;
  public static final int BREAK = 3;&lt;br /&gt;
  /**&lt;br /&gt;
   * @param node the current node to handle&lt;br /&gt;
   * @return 0 continue tree walk&lt;br /&gt;
   *         1 break this node (continue sibling)&lt;br /&gt;
   *         2 break this level (continue parent level)&lt;br /&gt;
   *         3 break tree walk &lt;br /&gt;
   */&lt;br /&gt;
  int handleTreeNode(TreeNode node);&lt;br /&gt;
} // TreeNodeCallback&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Your own tree with generic user object ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2007 Google Inc.&lt;br /&gt;
 *&lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 *&lt;br /&gt;
 *     http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 *&lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
/**&lt;br /&gt;
 * @author ycoppel@google.ru (Yohann Coppel)&lt;br /&gt;
 * &lt;br /&gt;
 * @param &amp;lt;T&amp;gt;&lt;br /&gt;
 *          Object&amp;quot;s type in the tree.&lt;br /&gt;
 */&lt;br /&gt;
public class Tree&amp;lt;T&amp;gt; {&lt;br /&gt;
  private T head;&lt;br /&gt;
  private ArrayList&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt; leafs = new ArrayList&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;();&lt;br /&gt;
  private Tree&amp;lt;T&amp;gt; parent = null;&lt;br /&gt;
  private HashMap&amp;lt;T, Tree&amp;lt;T&amp;gt;&amp;gt; locate = new HashMap&amp;lt;T, Tree&amp;lt;T&amp;gt;&amp;gt;();&lt;br /&gt;
  public Tree(T head) {&lt;br /&gt;
    this.head = head;&lt;br /&gt;
    locate.put(head, this);&lt;br /&gt;
  }&lt;br /&gt;
  public void addLeaf(T root, T leaf) {&lt;br /&gt;
    if (locate.containsKey(root)) {&lt;br /&gt;
      locate.get(root).addLeaf(leaf);&lt;br /&gt;
    } else {&lt;br /&gt;
      addLeaf(root).addLeaf(leaf);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public Tree&amp;lt;T&amp;gt; addLeaf(T leaf) {&lt;br /&gt;
    Tree&amp;lt;T&amp;gt; t = new Tree&amp;lt;T&amp;gt;(leaf);&lt;br /&gt;
    leafs.add(t);&lt;br /&gt;
    t.parent = this;&lt;br /&gt;
    t.locate = this.locate;&lt;br /&gt;
    locate.put(leaf, t);&lt;br /&gt;
    return t;&lt;br /&gt;
  }&lt;br /&gt;
  public Tree&amp;lt;T&amp;gt; setAsParent(T parentRoot) {&lt;br /&gt;
    Tree&amp;lt;T&amp;gt; t = new Tree&amp;lt;T&amp;gt;(parentRoot);&lt;br /&gt;
    t.leafs.add(this);&lt;br /&gt;
    this.parent = t;&lt;br /&gt;
    t.locate = this.locate;&lt;br /&gt;
    t.locate.put(head, this);&lt;br /&gt;
    t.locate.put(parentRoot, t);&lt;br /&gt;
    return t;&lt;br /&gt;
  }&lt;br /&gt;
  public T getHead() {&lt;br /&gt;
    return head;&lt;br /&gt;
  }&lt;br /&gt;
  public Tree&amp;lt;T&amp;gt; getTree(T element) {&lt;br /&gt;
    return locate.get(element);&lt;br /&gt;
  }&lt;br /&gt;
  public Tree&amp;lt;T&amp;gt; getParent() {&lt;br /&gt;
    return parent;&lt;br /&gt;
  }&lt;br /&gt;
  public Collection&amp;lt;T&amp;gt; getSuccessors(T root) {&lt;br /&gt;
    Collection&amp;lt;T&amp;gt; successors = new ArrayList&amp;lt;T&amp;gt;();&lt;br /&gt;
    Tree&amp;lt;T&amp;gt; tree = getTree(root);&lt;br /&gt;
    if (null != tree) {&lt;br /&gt;
      for (Tree&amp;lt;T&amp;gt; leaf : tree.leafs) {&lt;br /&gt;
        successors.add(leaf.head);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return successors;&lt;br /&gt;
  }&lt;br /&gt;
  public Collection&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt; getSubTrees() {&lt;br /&gt;
    return leafs;&lt;br /&gt;
  }&lt;br /&gt;
  public static &amp;lt;T&amp;gt; Collection&amp;lt;T&amp;gt; getSuccessors(T of, Collection&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt; in) {&lt;br /&gt;
    for (Tree&amp;lt;T&amp;gt; tree : in) {&lt;br /&gt;
      if (tree.locate.containsKey(of)) {&lt;br /&gt;
        return tree.getSuccessors(of);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return new ArrayList&amp;lt;T&amp;gt;();&lt;br /&gt;
  }&lt;br /&gt;
  @Override&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return printTree(0);&lt;br /&gt;
  }&lt;br /&gt;
  private static final int indent = 2;&lt;br /&gt;
  private String printTree(int increment) {&lt;br /&gt;
    String s = &amp;quot;&amp;quot;;&lt;br /&gt;
    String inc = &amp;quot;&amp;quot;;&lt;br /&gt;
    for (int i = 0; i &amp;lt; increment; ++i) {&lt;br /&gt;
      inc = inc + &amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    s = inc + head;&lt;br /&gt;
    for (Tree&amp;lt;T&amp;gt; child : leafs) {&lt;br /&gt;
      s += &amp;quot;\n&amp;quot; + child.printTree(increment + indent);&lt;br /&gt;
    }&lt;br /&gt;
    return s;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>