2015-11-04 1 views
1

Я новичок в дереве, как структуры. Я написал этот вид дерева.Итерация и поиск корня в структуре дерева java

Как пронестись по дереву? Как найти все корни (у меня есть метод для основного корня, но я хочу найти все корни, которые находятся внутри дерева) в дереве? Каков правильный способ использования древовидной структуры в java - каждый раз пишите свой один класс или используя TreeMap?

TreeNode

public class TreeNode<T> { 
private T value; 
private boolean hasParent; 
private ArrayList<TreeNode<T>> children; 

public TreeNode(T value) { 
    if (value == null) { 
     throw new IllegalArgumentException("Cannot insert null value!"); 
    } 
    this.value = value; 
    this.children = new ArrayList<TreeNode<T>>(); 
} 

public final T getValue() { 
    return this.value; 
} 

public final void setValue(T value) { 
    this.value = value; 
} 

public final int getChildrenCount() { 
    return this.children.size(); 
} 

public final void addChild(TreeNode<T> child) { 
    if (child == null) { 
     throw new IllegalArgumentException("Cannot insert null value!"); 
    } 

    if (child.hasParent) { 
     throw new IllegalArgumentException("The node already has a parent!"); 
    } 

    child.hasParent = true; 
    this.children.add(child); 
} 

public final TreeNode<T> getChild(int index) { 
    return this.children.get(index); 
} 

Дерево

public class Tree<T> { 
TreeNode<T> root; 

public Tree(T value) { 
    if (value == null) { 
     throw new IllegalArgumentException("Cannot insert null value!"); 
    } 

    this.root = new TreeNode<T>(value); 
} 

public Tree(T value, Tree<T>... children) { 
    this(value); 
    for (Tree<T> child : children) { 
     this.root.addChild(child.root); 
    } 
} 

public final TreeNode<T> getRoot() { 
    return this.root; 
} 
+0

Какие трудности у вас возникают? Пожалуйста, будьте более конкретными. – sferencik

+0

@ sferencik Я обновляю свой вопрос. – NoSuchUserException

+1

Помогает ли [это] (http://stackoverflow.com/a/16877866/1540600)? – sferencik

ответ

0

Здесь я могу использовать все внутренние корни и все узлы.

while (!stack.isEmpty()) { 

     TreeNode<Integer> currentNode = stack.pop(); 
     for (int i = 0; i < currentNode.getChildrenCount(); i++) { 
      TreeNode<Integer> childNode = currentNode.getChild(i); 
      if (childNode == null) { 
       System.out.println("Not a root."); 
      } else { 
       System.out.println(childNode.getValue()); 
       counter += childNode.getChildrenCount(); 
      } 
     } 

    }