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;
}
}