Subato

Resource Files

Baumimplementierung

Ergänzen Sie die Klasse Tree aus der Vorlesung um folgende weitere Methoden:
  • void forEach(Consumer<? super E> con);
    Das Argument soll auf alle Elemente des Baumes angewendet werden.
  • boolean contains(Predicate<? super E> pred);
    Enthält der Baum ein Element, das das Prädikat erfüllt?
  • void fringe(List<E> result);
    Alle Elemente an Blättern des Baumes werden in einer Liste gesammelt.
  • void ancestors(List<E> result);
    Alle Elemente von eigenen Vorfahren, sortiert vom Element des Elternknoten hin zur Wurzel.
  • void siblings(List<E> result);
    Alle Elemente meiner Geschwister.
  • void pathTo(E elem, List<E> result);
    Wenn es einen Pfad von mir zu einem Nachkommen mit dem Element elem gibt, ist der Pfad in der Liste, ansonsten ist die Liste leer.
  • <R> Tree<R> map(Function<? super E, ? extends R> f);
    Erzeuge einen neuen Baum, indem alle Elemente mit der Funktion f transformiert werden.

package name.panitz.util.tree; import java.util.ArrayList; import java.util.List; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.function.*; public class Tree<E> { final E element; final List<Tree<E>> children; private Tree<E> parent=null; public Tree<E> getParent() { return parent; } public void setParent(Tree<E> p) { if (null!=parent)throw new RuntimeException("Multiple assignment to parent node."); this.parent = p; } @SafeVarargs public Tree(E element, Tree<E>... children) { this.element = element; this.children = List.of(children); this.children.parallelStream().forEach(child->child.setParent(this)); } public int size(){ return children.parallelStream().reduce(0, (r,c)->c.size()+r,(x,y)->x+y)+1; } @Override public String toString() { return element.toString()+children.toString(); } String toLaTeX() { var result = new StringBuffer(); result.append("\\begin{tikzpicture}[sibling distance=10em," + "every node/.style = {shape=rectangle, rounded corners," + "draw, align=center,top color=white, bottom color=blue!20}]]"); result.append("\\"); toLaTeXAux(result); result.append(";\n"); result.append("\\end{tikzpicture}"); return result.toString(); } void toLaTeXAux(StringBuffer result) { result.append("node {"+element+"}"); children.stream().forEach(child -> { result.append("\n child {"); child.toLaTeXAux(result); result.append("}"); }); } String toXML() { var result = new StringBuffer(); result.append("<?xml version=\"1.0\"?>\n"); toXMLAux(result); return result.toString(); } void toXMLAux(StringBuffer result) { result.append("<node> <element>"+element+"</element>"); children.stream().forEach(child -> { result.append("\n <child>"); child.toXMLAux(result); result.append("</child>"); }); result.append("</node>"); } List<Tree<E>> auntsAndUncles(){ var opa = parent.parent; return opa.children.parallelStream() .filter(c->c!=parent).collect(Collectors.toList()); } List<E> cousins(){ List<E> result = new ArrayList<>(); if (parent==null||parent.parent==null) return result; auntsAndUncles() .stream() .forEach(cs -> cs.children.stream().forEach(c->result.add(c.element))); return result; } public void forEach(Consumer<? super E> con) { //TODO } public boolean contains(Predicate<? super E> pred) { //TODO return false; } public List<E> fringe() { var result = new ArrayList<E>(); fringe(result); return result; } public void fringe(List<E> result) { //TODO } public List<E> ancestors(){ var result = new ArrayList<E>(); ancestors(result); return result; } public void ancestors(List<E> result){ //TODO } public List<E> siblings(){ var result = new ArrayList<E>(); siblings(result); return result; } public void siblings(List<E> result){ //TODO } public List<E> pathTo(E elem) { var result = new ArrayList<E>(); pathTo(elem,result); return result; } public void pathTo(E elem, List<E> result) { //TODO } public <R> Tree<R> map(Function<? super E, ? extends R> f) { //TODO return null; } }
java