print hirarchical done
This commit is contained in:
commit
88ebe634fd
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,34 @@
|
|||
#BlueJ class context
|
||||
comment0.target=BinaryTree
|
||||
comment0.text=\r\n\ <p>\r\n\ Materialien\ zu\ den\ zentralen\ NRW-Abiturpruefungen\ im\ Fach\ Informatik\ ab\ 2018\r\n\ </p>\r\n\ <p>\r\n\ Generische\ Klasse\ BinaryTree<ContentType>\r\n\ </p>\r\n\ <p>\r\n\ Mithilfe\ der\ generischen\ Klasse\ BinaryTree\ koennen\ beliebig\ viele\r\n\ Inhaltsobjekte\ vom\ Typ\ ContentType\ in\ einem\ Binaerbaum\ verwaltet\ werden.\ Ein\r\n\ Objekt\ der\ Klasse\ stellt\ entweder\ einen\ leeren\ Baum\ dar\ oder\ verwaltet\ ein\r\n\ Inhaltsobjekt\ sowie\ einen\ linken\ und\ einen\ rechten\ Teilbaum,\ die\ ebenfalls\r\n\ Objekte\ der\ generischen\ Klasse\ BinaryTree\ sind.\r\n\ </p>\r\n\ \r\n\ @author\ Qualitaets-\ und\ UnterstuetzungsAgentur\ -\ Landesinstitut\ fuer\ Schule\r\n\ @version\ Generisch_03\ 2014-03-01\r\n
|
||||
comment1.params=
|
||||
comment1.target=BinaryTree()
|
||||
comment1.text=\r\n\ Nach\ dem\ Aufruf\ des\ Konstruktors\ existiert\ ein\ leerer\ Binaerbaum.\r\n
|
||||
comment10.params=
|
||||
comment10.target=BinaryTree\ getRightTree()
|
||||
comment10.text=\r\n\ Diese\ Anfrage\ liefert\ den\ rechten\ Teilbaum\ des\ Binaerbaumes.\ Wenn\ der\r\n\ Binaerbaum\ (this)\ leer\ ist,\ wird\ null\ zurueckgegeben.\r\n\ \r\n\ @return\ rechter\ Teilbaum\ vom\ Typ\ BinaryTree<ContentType>\ oder\ null,\ wenn\r\n\ der\ aktuelle\ Binaerbaum\ (this)\ leer\ ist\r\n
|
||||
comment2.params=pContent
|
||||
comment2.target=BinaryTree(java.lang.Object)
|
||||
comment2.text=\r\n\ Wenn\ der\ Parameter\ pContent\ ungleich\ null\ ist,\ existiert\ nach\ dem\ Aufruf\r\n\ des\ Konstruktors\ der\ Binaerbaum\ und\ hat\ pContent\ als\ Inhaltsobjekt\ und\r\n\ zwei\ leere\ Teilbaeume.\ Falls\ der\ Parameter\ null\ ist,\ wird\ ein\ leerer\r\n\ Binaerbaum\ erzeugt.\r\n\ \r\n\ @param\ pContent\r\n\ \ \ \ \ \ \ \ \ \ \ \ das\ Inhaltsobjekt\ des\ Wurzelknotens\ vom\ Typ\ ContentType\r\n
|
||||
comment3.params=pContent\ pLeftTree\ pRightTree
|
||||
comment3.target=BinaryTree(java.lang.Object,\ BinaryTree,\ BinaryTree)
|
||||
comment3.text=\r\n\ Wenn\ der\ Parameter\ pContent\ ungleich\ null\ ist,\ wird\ ein\ Binaerbaum\ mit\r\n\ pContent\ als\ Inhalt\ und\ den\ beiden\ Teilbaeume\ pLeftTree\ und\ pRightTree\r\n\ erzeugt.\ Sind\ pLeftTree\ oder\ pRightTree\ gleich\ null,\ wird\ der\r\n\ entsprechende\ Teilbaum\ als\ leerer\ Binaerbaum\ eingefuegt.\ So\ kann\ es\ also\r\n\ nie\ passieren,\ dass\ linke\ oder\ rechte\ Teilbaeume\ null\ sind.\ Wenn\ der\r\n\ Parameter\ pContent\ gleich\ null\ ist,\ wird\ ein\ leerer\ Binaerbaum\ erzeugt.\r\n\ \r\n\ @param\ pContent\r\n\ \ \ \ \ \ \ \ \ \ \ \ das\ Inhaltsobjekt\ des\ Wurzelknotens\ vom\ Typ\ ContentType\r\n\ @param\ pLeftTree\r\n\ \ \ \ \ \ \ \ \ \ \ \ der\ linke\ Teilbaum\ vom\ Typ\ BinaryTree<ContentType>\r\n\ @param\ pRightTree\r\n\ \ \ \ \ \ \ \ \ \ \ \ der\ rechte\ Teilbaum\ vom\ Typ\ BinaryTree<ContentType>\r\n
|
||||
comment4.params=
|
||||
comment4.target=boolean\ isEmpty()
|
||||
comment4.text=\r\n\ Diese\ Anfrage\ liefert\ den\ Wahrheitswert\ true,\ wenn\ der\ Binaerbaum\ leer\r\n\ ist,\ sonst\ liefert\ sie\ den\ Wert\ false.\r\n\ \r\n\ @return\ true,\ wenn\ der\ Binaerbaum\ leer\ ist,\ sonst\ false\r\n
|
||||
comment5.params=pContent
|
||||
comment5.target=void\ setContent(java.lang.Object)
|
||||
comment5.text=\r\n\ Wenn\ pContent\ null\ ist,\ geschieht\ nichts.\ <br\ />\r\n\ Ansonsten\:\ Wenn\ der\ Binaerbaum\ leer\ ist,\ wird\ der\ Parameter\ pContent\ als\r\n\ Inhaltsobjekt\ sowie\ ein\ leerer\ linker\ und\ rechter\ Teilbaum\ eingefuegt.\r\n\ Ist\ der\ Binaerbaum\ nicht\ leer,\ wird\ das\ Inhaltsobjekt\ durch\ pContent\r\n\ ersetzt.\ Die\ Teilbaeume\ werden\ nicht\ geaendert.\r\n\ \r\n\ @param\ pContent\r\n\ \ \ \ \ \ \ \ \ \ \ \ neues\ Inhaltsobjekt\ vom\ Typ\ ContentType\r\n
|
||||
comment6.params=
|
||||
comment6.target=java.lang.Object\ getContent()
|
||||
comment6.text=\r\n\ Diese\ Anfrage\ liefert\ das\ Inhaltsobjekt\ des\ Binaerbaums.\ Wenn\ der\r\n\ Binaerbaum\ leer\ ist,\ wird\ null\ zurueckgegeben.\r\n\ \r\n\ @return\ das\ Inhaltsobjekt\ der\ Wurzel\ vom\ Typ\ ContentType\ bzw.\ null,\ wenn\r\n\ \ \ \ \ \ \ \ \ der\ Binaerbaum\ leer\ ist\r\n
|
||||
comment7.params=pTree
|
||||
comment7.target=void\ setLeftTree(BinaryTree)
|
||||
comment7.text=\r\n\ Falls\ der\ Parameter\ null\ ist,\ geschieht\ nichts.\ Wenn\ der\ Binaerbaum\ leer\r\n\ ist,\ wird\ pTree\ nicht\ angehaengt.\ Andernfalls\ erhaelt\ der\ Binaerbaum\ den\r\n\ uebergebenen\ BinaryTree\ als\ linken\ Teilbaum.\r\n\ \r\n\ @param\ pTree\r\n\ \ \ \ \ \ \ \ \ \ \ \ neuer\ linker\ Teilbaum\ vom\ Typ\ BinaryTree<ContentType>\r\n
|
||||
comment8.params=pTree
|
||||
comment8.target=void\ setRightTree(BinaryTree)
|
||||
comment8.text=\r\n\ Falls\ der\ Parameter\ null\ ist,\ geschieht\ nichts.\ Wenn\ der\ Binaerbaum\ leer\r\n\ ist,\ wird\ pTree\ nicht\ angehaengt.\ Andernfalls\ erhaelt\ der\ Binaerbaum\ den\r\n\ uebergebenen\ BinaryTree\ als\ rechten\ Teilbaum.\r\n\ \r\n\ @param\ pTree\r\n\ \ \ \ \ \ \ \ \ \ \ \ neuer\ linker\ Teilbaum\ vom\ Typ\ BinaryTree<ContentType>\r\n
|
||||
comment9.params=
|
||||
comment9.target=BinaryTree\ getLeftTree()
|
||||
comment9.text=\r\n\ Diese\ Anfrage\ liefert\ den\ linken\ Teilbaum\ des\ Binaerbaumes.\ Wenn\ der\r\n\ Binaerbaum\ leer\ ist,\ wird\ null\ zurueckgegeben.\r\n\ \r\n\ @return\ linker\ Teilbaum\ vom\ Typ\ BinaryTree<ContentType>\ oder\ null,\ wenn\r\n\ der\ aktuelle\ Binaerbaum\ leer\ ist\r\n
|
||||
numComments=11
|
|
@ -0,0 +1,210 @@
|
|||
/**
|
||||
* <p>
|
||||
* Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018
|
||||
* </p>
|
||||
* <p>
|
||||
* Generische Klasse BinaryTree<ContentType>
|
||||
* </p>
|
||||
* <p>
|
||||
* Mithilfe der generischen Klasse BinaryTree koennen beliebig viele
|
||||
* Inhaltsobjekte vom Typ ContentType in einem Binaerbaum verwaltet werden. Ein
|
||||
* Objekt der Klasse stellt entweder einen leeren Baum dar oder verwaltet ein
|
||||
* Inhaltsobjekt sowie einen linken und einen rechten Teilbaum, die ebenfalls
|
||||
* Objekte der generischen Klasse BinaryTree sind.
|
||||
* </p>
|
||||
*
|
||||
* @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule
|
||||
* @version Generisch_03 2014-03-01
|
||||
*/
|
||||
public class BinaryTree<ContentType> {
|
||||
|
||||
/* --------- Anfang der privaten inneren Klasse -------------- */
|
||||
|
||||
/**
|
||||
* Durch diese innere Klasse kann man dafuer sorgen, dass ein leerer Baum
|
||||
* null ist, ein nicht-leerer Baum jedoch immer eine nicht-null-Wurzel sowie
|
||||
* nicht-null-Teilbaeume, ggf. leere Teilbaeume hat.
|
||||
*/
|
||||
private class BTNode<CT> {
|
||||
|
||||
private CT content;
|
||||
private BinaryTree<CT> left, right;
|
||||
|
||||
public BTNode(CT pContent) {
|
||||
// Der Knoten hat einen linken und einen rechten Teilbaum, die
|
||||
// beide von null verschieden sind. Also hat ein Blatt immer zwei
|
||||
// leere Teilbaeume unter sich.
|
||||
this.content = pContent;
|
||||
left = new BinaryTree<CT>();
|
||||
right = new BinaryTree<CT>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ----------- Ende der privaten inneren Klasse -------------- */
|
||||
|
||||
private BTNode<ContentType> node;
|
||||
|
||||
/**
|
||||
* Nach dem Aufruf des Konstruktors existiert ein leerer Binaerbaum.
|
||||
*/
|
||||
public BinaryTree() {
|
||||
this.node = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wenn der Parameter pContent ungleich null ist, existiert nach dem Aufruf
|
||||
* des Konstruktors der Binaerbaum und hat pContent als Inhaltsobjekt und
|
||||
* zwei leere Teilbaeume. Falls der Parameter null ist, wird ein leerer
|
||||
* Binaerbaum erzeugt.
|
||||
*
|
||||
* @param pContent
|
||||
* das Inhaltsobjekt des Wurzelknotens vom Typ ContentType
|
||||
*/
|
||||
public BinaryTree(ContentType pContent) {
|
||||
if (pContent != null) {
|
||||
this.node = new BTNode<ContentType>(pContent);
|
||||
} else {
|
||||
this.node = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wenn der Parameter pContent ungleich null ist, wird ein Binaerbaum mit
|
||||
* pContent als Inhalt und den beiden Teilbaeume pLeftTree und pRightTree
|
||||
* erzeugt. Sind pLeftTree oder pRightTree gleich null, wird der
|
||||
* entsprechende Teilbaum als leerer Binaerbaum eingefuegt. So kann es also
|
||||
* nie passieren, dass linke oder rechte Teilbaeume null sind. Wenn der
|
||||
* Parameter pContent gleich null ist, wird ein leerer Binaerbaum erzeugt.
|
||||
*
|
||||
* @param pContent
|
||||
* das Inhaltsobjekt des Wurzelknotens vom Typ ContentType
|
||||
* @param pLeftTree
|
||||
* der linke Teilbaum vom Typ BinaryTree<ContentType>
|
||||
* @param pRightTree
|
||||
* der rechte Teilbaum vom Typ BinaryTree<ContentType>
|
||||
*/
|
||||
public BinaryTree(ContentType pContent, BinaryTree<ContentType> pLeftTree, BinaryTree<ContentType> pRightTree) {
|
||||
if (pContent != null) {
|
||||
this.node = new BTNode<ContentType>(pContent);
|
||||
if (pLeftTree != null) {
|
||||
this.node.left = pLeftTree;
|
||||
} else {
|
||||
this.node.left = new BinaryTree<ContentType>();
|
||||
}
|
||||
if (pRightTree != null) {
|
||||
this.node.right = pRightTree;
|
||||
} else {
|
||||
this.node.right = new BinaryTree<ContentType>();
|
||||
}
|
||||
} else {
|
||||
// Da der Inhalt null ist, wird ein leerer BinarySearchTree erzeugt.
|
||||
this.node = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Diese Anfrage liefert den Wahrheitswert true, wenn der Binaerbaum leer
|
||||
* ist, sonst liefert sie den Wert false.
|
||||
*
|
||||
* @return true, wenn der Binaerbaum leer ist, sonst false
|
||||
*/
|
||||
public boolean isEmpty() {
|
||||
return this.node == null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wenn pContent null ist, geschieht nichts. <br />
|
||||
* Ansonsten: Wenn der Binaerbaum leer ist, wird der Parameter pContent als
|
||||
* Inhaltsobjekt sowie ein leerer linker und rechter Teilbaum eingefuegt.
|
||||
* Ist der Binaerbaum nicht leer, wird das Inhaltsobjekt durch pContent
|
||||
* ersetzt. Die Teilbaeume werden nicht geaendert.
|
||||
*
|
||||
* @param pContent
|
||||
* neues Inhaltsobjekt vom Typ ContentType
|
||||
*/
|
||||
public void setContent(ContentType pContent) {
|
||||
if (pContent != null) {
|
||||
if (this.isEmpty()) {
|
||||
node = new BTNode<ContentType>(pContent);
|
||||
this.node.left = new BinaryTree<ContentType>();
|
||||
this.node.right = new BinaryTree<ContentType>();
|
||||
}
|
||||
this.node.content = pContent;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Diese Anfrage liefert das Inhaltsobjekt des Binaerbaums. Wenn der
|
||||
* Binaerbaum leer ist, wird null zurueckgegeben.
|
||||
*
|
||||
* @return das Inhaltsobjekt der Wurzel vom Typ ContentType bzw. null, wenn
|
||||
* der Binaerbaum leer ist
|
||||
*/
|
||||
public ContentType getContent() {
|
||||
if (this.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
return this.node.content;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Falls der Parameter null ist, geschieht nichts. Wenn der Binaerbaum leer
|
||||
* ist, wird pTree nicht angehaengt. Andernfalls erhaelt der Binaerbaum den
|
||||
* uebergebenen BinaryTree als linken Teilbaum.
|
||||
*
|
||||
* @param pTree
|
||||
* neuer linker Teilbaum vom Typ BinaryTree<ContentType>
|
||||
*/
|
||||
public void setLeftTree(BinaryTree<ContentType> pTree) {
|
||||
if (!this.isEmpty() && pTree != null) {
|
||||
this.node.left = pTree;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Falls der Parameter null ist, geschieht nichts. Wenn der Binaerbaum leer
|
||||
* ist, wird pTree nicht angehaengt. Andernfalls erhaelt der Binaerbaum den
|
||||
* uebergebenen BinaryTree als rechten Teilbaum.
|
||||
*
|
||||
* @param pTree
|
||||
* neuer linker Teilbaum vom Typ BinaryTree<ContentType>
|
||||
*/
|
||||
public void setRightTree(BinaryTree<ContentType> pTree) {
|
||||
if (!this.isEmpty() && pTree != null) {
|
||||
this.node.right = pTree;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Diese Anfrage liefert den linken Teilbaum des Binaerbaumes. Wenn der
|
||||
* Binaerbaum leer ist, wird null zurueckgegeben.
|
||||
*
|
||||
* @return linker Teilbaum vom Typ BinaryTree<ContentType> oder null, wenn
|
||||
* der aktuelle Binaerbaum leer ist
|
||||
*/
|
||||
public BinaryTree<ContentType> getLeftTree() {
|
||||
if (!this.isEmpty()) {
|
||||
return this.node.left;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Diese Anfrage liefert den rechten Teilbaum des Binaerbaumes. Wenn der
|
||||
* Binaerbaum (this) leer ist, wird null zurueckgegeben.
|
||||
*
|
||||
* @return rechter Teilbaum vom Typ BinaryTree<ContentType> oder null, wenn
|
||||
* der aktuelle Binaerbaum (this) leer ist
|
||||
*/
|
||||
public BinaryTree<ContentType> getRightTree() {
|
||||
if (!this.isEmpty()) {
|
||||
return this.node.right;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
------------------------------------------------------------------------
|
||||
Dies ist die README-Datei des Projekts. Hier sollten Sie Ihr Projekt
|
||||
beschreiben.
|
||||
Erzählen Sie dem Leser (jemand, der nichts über dieses Projekt weiss),
|
||||
alles, was er/sie wissen muss. Üblicherweise sollte der Kommentar
|
||||
zumindest die folgenden Angaben umfassen:
|
||||
------------------------------------------------------------------------
|
||||
|
||||
PROJEKTBEZEICHNUNG:
|
||||
PROJEKTZWECK:
|
||||
VERSION oder DATUM:
|
||||
WIE IST DAS PROJEKT ZU STARTEN:
|
||||
AUTOR(EN):
|
||||
BENUTZERHINWEISE:
|
Binary file not shown.
|
@ -0,0 +1,36 @@
|
|||
#BlueJ class context
|
||||
comment0.target=Traversierungen
|
||||
comment0.text=\r\n\ Implementierungen\ der\ drei\ Traversierungsarten\ auf\r\n\ Bin\u00E4rb\u00E4umen\ mit\ Zahl-Inhalten.\r\n
|
||||
comment1.params=
|
||||
comment1.target=Traversierungen()
|
||||
comment10.params=pRoot
|
||||
comment10.target=void\ inorder(BinaryTree)
|
||||
comment10.text=\r\n\ Rekursive\ Methode\ f\u00FCr\ die\ Inorder-Traversierung.\r\n\ @param\ pRoot\ Der\ Wurzelknoten\ des\ aktuellen\ Teilbaumes.\r\n
|
||||
comment11.params=
|
||||
comment11.target=int\ findMax()
|
||||
comment11.text=\r\n\ Findet\ das\ Maximum\ im\ Baum.\r\n
|
||||
comment12.params=pNum
|
||||
comment12.target=void\ add(int)
|
||||
comment12.text=\r\n\ Addiert\ pNum\ zu\ jedem\ Wert\ im\ Bin\u00E4rbaum.\r\n
|
||||
comment2.params=
|
||||
comment2.target=void\ preorder()
|
||||
comment2.text=\r\n\ Aufruf\ f\u00FCr\ die\ Preorder-Traversierung.\r\n\r\n\ @see\ \#preorder(BinaryTree)\r\n
|
||||
comment3.params=pRoot
|
||||
comment3.target=void\ preorder(BinaryTree)
|
||||
comment3.text=\r\n\ Rekursive\ Methode\ f\u00FCr\ die\ Preorder-Traversierung.\r\n\ @param\ pRoot\ Der\ Wurzelknoten\ des\ aktuellen\ Teilbaumes.\r\n
|
||||
comment4.params=
|
||||
comment4.target=void\ printHirarchical()
|
||||
comment5.params=pRoot\ xOff
|
||||
comment5.target=void\ printHirarchical(BinaryTree,\ int)
|
||||
comment6.params=off
|
||||
comment6.target=void\ printOffset(int)
|
||||
comment7.params=
|
||||
comment7.target=void\ postorder()
|
||||
comment7.text=\r\n\ Aufruf\ f\u00FCr\ die\ Postorder-Traversierung.\r\n\r\n\ @see\ \#postorder(BinaryTree)\r\n
|
||||
comment8.params=pRoot
|
||||
comment8.target=void\ postorder(BinaryTree)
|
||||
comment8.text=\r\n\ Rekursive\ Methode\ f\u00FCr\ die\ Postorder-Traversierung.\r\n\ @param\ pRoot\ Der\ Wurzelknoten\ des\ aktuellen\ Teilbaumes.\r\n
|
||||
comment9.params=
|
||||
comment9.target=void\ inorder()
|
||||
comment9.text=\r\n\ Aufruf\ f\u00FCr\ die\ Inorder-Traversierung.\r\n\r\n\ @see\ \#inorder(BinaryTree)\r\n
|
||||
numComments=13
|
|
@ -0,0 +1,116 @@
|
|||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* Implementierungen der drei Traversierungsarten auf
|
||||
* Binärbäumen mit Zahl-Inhalten.
|
||||
*/
|
||||
public class Traversierungen {
|
||||
|
||||
private BinaryTree<Integer> root;
|
||||
|
||||
public Traversierungen() {
|
||||
// Erstellen eines Integer-Baumes mit
|
||||
// 15 Knoten
|
||||
// 0.5 Prozent der Knoten werden im linken Teilbaum generiert
|
||||
// wobei zufällig ca. 20 Prozent der Knoten doch rechts einsortiert werden
|
||||
root = Trees.generateIntegerTree(3, 0.5, 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* Aufruf für die Preorder-Traversierung.
|
||||
*
|
||||
* @see #preorder(BinaryTree)
|
||||
*/
|
||||
public void preorder() {
|
||||
preorder(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rekursive Methode für die Preorder-Traversierung.
|
||||
* @param pRoot Der Wurzelknoten des aktuellen Teilbaumes.
|
||||
*/
|
||||
public void preorder( BinaryTree<Integer> pRoot ) {
|
||||
// TODO: Ausgabe das Baumes auf der Kommandozeile in Preorder
|
||||
}
|
||||
|
||||
public void printHirarchical() {
|
||||
printHirarchical(root, 0);
|
||||
}
|
||||
|
||||
public void printHirarchical(BinaryTree<Integer> pRoot, int xOff) {
|
||||
if (pRoot.getContent() == null) {
|
||||
xOff--;
|
||||
return;
|
||||
}
|
||||
if (pRoot.getLeftTree() != null) {
|
||||
printOffset(xOff);
|
||||
System.out.println(pRoot.getContent());
|
||||
xOff++;
|
||||
printHirarchical(pRoot.getLeftTree(), xOff);
|
||||
}
|
||||
if (pRoot.getRightTree() != null) {
|
||||
printOffset(xOff);
|
||||
System.out.println(pRoot.getContent());
|
||||
xOff++;
|
||||
printHirarchical(pRoot.getRightTree(), xOff);
|
||||
}
|
||||
}
|
||||
|
||||
private void printOffset(int off) {
|
||||
for (int i = 0; i < off; i++) {
|
||||
if (i == off - 1) {
|
||||
System.out.print("|> ");
|
||||
} else {
|
||||
System.out.print("| ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Aufruf für die Postorder-Traversierung.
|
||||
*
|
||||
* @see #postorder(BinaryTree)
|
||||
*/
|
||||
public void postorder() {
|
||||
postorder(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rekursive Methode für die Postorder-Traversierung.
|
||||
* @param pRoot Der Wurzelknoten des aktuellen Teilbaumes.
|
||||
*/
|
||||
public void postorder( BinaryTree<Integer> pRoot ) {
|
||||
// TODO: Ausgabe das Baumes auf der Kommandozeile in Postorder
|
||||
}
|
||||
|
||||
/**
|
||||
* Aufruf für die Inorder-Traversierung.
|
||||
*
|
||||
* @see #inorder(BinaryTree)
|
||||
*/
|
||||
public void inorder() {
|
||||
inorder(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rekursive Methode für die Inorder-Traversierung.
|
||||
* @param pRoot Der Wurzelknoten des aktuellen Teilbaumes.
|
||||
*/
|
||||
public void inorder( BinaryTree<Integer> pRoot ) {
|
||||
// TODO: Ausgabe das Baumes auf der Kommandozeile in Inorder
|
||||
}
|
||||
|
||||
/**
|
||||
* Findet das Maximum im Baum.
|
||||
*/
|
||||
public int findMax() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Addiert pNum zu jedem Wert im Binärbaum.
|
||||
*/
|
||||
public void add( int pNum ) {
|
||||
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,48 @@
|
|||
#BlueJ class context
|
||||
comment0.target=Trees
|
||||
comment0.text=\r\n\ Eine\ Sammlung\ von\ Klassenmethoden,\ um\ wiederkehrende\r\n\ Aufgaben\ mit\ bin\u00E4ren\ B\u00E4umen\ zu\ vereinfachen.\r\n\ @version\ 0.1\ (2019-09-13)\r\n\ @author\ J.\ Neugebauer\ <schule@neugebauer.cc>\r\n
|
||||
comment1.params=pRoot
|
||||
comment1.target=int\ getMaxDepth(BinaryTree)
|
||||
comment10.params=pRoot\ pOut
|
||||
comment10.target=void\ printPostorder(BinaryTree,\ java.io.PrintStream)
|
||||
comment11.params=pRoot
|
||||
comment11.target=void\ printInorder(BinaryTree)
|
||||
comment12.params=pRoot\ pOut
|
||||
comment12.target=void\ printInorder(BinaryTree,\ java.io.PrintStream)
|
||||
comment13.params=pNodeCount\ pMinValue\ pMaxValue
|
||||
comment13.target=BinaryTree\ generateBalancedIntegerTree(int,\ int,\ int)
|
||||
comment14.params=pDepth\ pMinValue\ pMaxValue
|
||||
comment14.target=BinaryTree\ generateCompleteIntegerTree(int,\ int,\ int)
|
||||
comment15.params=pNodeCount\ pWeight\ pUncertainty
|
||||
comment15.target=BinaryTree\ generateIntegerTree(int,\ double,\ double)
|
||||
comment16.params=pNodeCount\ pMinValue\ pMaxValue\ pWeight\ pUncertainty
|
||||
comment16.target=BinaryTree\ generateIntegerTree(int,\ int,\ int,\ double,\ double)
|
||||
comment17.params=
|
||||
comment17.target=java.lang.Integer\ call()
|
||||
comment18.params=pNodeCount\ pWeight\ pUncertainty
|
||||
comment18.target=BinaryTree\ generateStringTree(int,\ double,\ double)
|
||||
comment19.params=pNodeCount\ pWords\ pWeight\ pUncertainty
|
||||
comment19.target=BinaryTree\ generateStringTree(int,\ java.lang.String[],\ double,\ double)
|
||||
comment2.params=pRoot
|
||||
comment2.target=int\ countNodes(BinaryTree)
|
||||
comment20.params=
|
||||
comment20.target=java.lang.String\ call()
|
||||
comment21.params=pNodeCount\ pGenerator\ pWeight\ pUncertainty
|
||||
comment21.target=BinaryTree\ generateTree(int,\ java.util.concurrent.Callable,\ double,\ double)
|
||||
comment22.params=pRoot\ pNodeCount\ pGenerator\ pWeight\ pUncertainty
|
||||
comment22.target=BinaryTree\ generateTree(BinaryTree,\ int,\ java.util.concurrent.Callable,\ double,\ double)
|
||||
comment3.params=pRoot
|
||||
comment3.target=int\ countLeaves(BinaryTree)
|
||||
comment4.params=pRoot
|
||||
comment4.target=void\ printPretty(BinaryTree)
|
||||
comment5.params=pRoot\ pOut
|
||||
comment5.target=void\ printPretty(BinaryTree,\ java.io.PrintStream)
|
||||
comment6.params=pRoot\ prefix\ isTail\ sb
|
||||
comment6.target=java.lang.StringBuilder\ printPretty(BinaryTree,\ java.lang.StringBuilder,\ boolean,\ java.lang.StringBuilder)
|
||||
comment7.params=pRoot
|
||||
comment7.target=void\ printPreorder(BinaryTree)
|
||||
comment8.params=pRoot\ pOut
|
||||
comment8.target=void\ printPreorder(BinaryTree,\ java.io.PrintStream)
|
||||
comment9.params=pRoot
|
||||
comment9.target=void\ printPostorder(BinaryTree)
|
||||
numComments=23
|
|
@ -0,0 +1,161 @@
|
|||
import java.io.PrintStream;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
/**
|
||||
* Eine Sammlung von Klassenmethoden, um wiederkehrende
|
||||
* Aufgaben mit binären Bäumen zu vereinfachen.
|
||||
* @version 0.1 (2019-09-13)
|
||||
* @author J. Neugebauer <schule@neugebauer.cc>
|
||||
*/
|
||||
public class Trees {
|
||||
|
||||
public static <T> int getMaxDepth( BinaryTree<T> pRoot ) {
|
||||
if( pRoot.isEmpty() ) {
|
||||
return 0;
|
||||
}
|
||||
return 1 + Math.max(
|
||||
getMaxDepth( pRoot.getLeftTree() ),
|
||||
getMaxDepth( pRoot.getRightTree() )
|
||||
);
|
||||
}
|
||||
|
||||
public static <T> int countNodes( BinaryTree<T> pRoot ) {
|
||||
if( pRoot.isEmpty() ) {
|
||||
return 0;
|
||||
}
|
||||
return 1 + countNodes( pRoot.getLeftTree() ) + countNodes( pRoot.getRightTree() );
|
||||
}
|
||||
|
||||
public static <T> int countLeaves( BinaryTree<T> pRoot ) {
|
||||
if( pRoot.isEmpty() ) {
|
||||
return 0;
|
||||
} else if( pRoot.getLeftTree().isEmpty() && pRoot.getRightTree().isEmpty() ) {
|
||||
return 1;
|
||||
}
|
||||
return countLeaves( pRoot.getLeftTree() ) + countLeaves( pRoot.getRightTree() );
|
||||
}
|
||||
|
||||
public static <T> void printPretty( BinaryTree<T> pRoot ) {
|
||||
printPretty(pRoot, System.out);
|
||||
}
|
||||
|
||||
public static <T> void printPretty( BinaryTree<T> pRoot, PrintStream pOut ) {
|
||||
pOut.print(printPretty(pRoot, new StringBuilder(), true, new StringBuilder()).toString());
|
||||
}
|
||||
|
||||
// Adapted from https://stackoverflow.com/a/27153988/10921408
|
||||
private static <T> StringBuilder printPretty( BinaryTree<T> pRoot, StringBuilder prefix, boolean isTail, StringBuilder sb) {
|
||||
if( !pRoot.getRightTree().isEmpty() ) {
|
||||
printPretty(pRoot.getRightTree(), new StringBuilder().append(prefix).append(isTail ? "│ " : " "), false, sb);
|
||||
}
|
||||
sb.append(prefix).append(isTail ? "└── " : "┌── ").append(pRoot.getContent().toString()).append("\n");
|
||||
if( !pRoot.getLeftTree().isEmpty() ) {
|
||||
printPretty(pRoot.getLeftTree(), new StringBuilder().append(prefix).append(isTail ? " " : "│ "), true, sb);
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
|
||||
public static <T> void printPreorder( BinaryTree<T> pRoot ) {
|
||||
printPreorder(pRoot, System.out);
|
||||
}
|
||||
|
||||
public static <T> void printPreorder( BinaryTree<T> pRoot, PrintStream pOut ) {
|
||||
if( pRoot.getContent() == null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
pOut.print(pRoot.getContent().toString() + ",");
|
||||
printPreorder(pRoot.getLeftTree(), pOut);
|
||||
printPreorder(pRoot.getRightTree(), pOut);
|
||||
}
|
||||
|
||||
public static <T> void printPostorder( BinaryTree<T> pRoot ) {
|
||||
printPostorder(pRoot, System.out);
|
||||
}
|
||||
|
||||
public static <T> void printPostorder( BinaryTree<T> pRoot, PrintStream pOut ) {
|
||||
if( pRoot.getContent() == null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
pOut.print(pRoot.getContent().toString() + ",");
|
||||
printPostorder(pRoot.getLeftTree(), pOut);
|
||||
printPostorder(pRoot.getRightTree(), pOut);
|
||||
}
|
||||
|
||||
public static <T> void printInorder( BinaryTree<T> pRoot ) {
|
||||
printInorder(pRoot, System.out);
|
||||
}
|
||||
|
||||
public static <T> void printInorder( BinaryTree<T> pRoot, PrintStream pOut ) {
|
||||
if( pRoot.getContent() == null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
pOut.print(pRoot.getContent().toString() + ",");
|
||||
printInorder(pRoot.getLeftTree(), pOut);
|
||||
printInorder(pRoot.getRightTree(), pOut);
|
||||
}
|
||||
|
||||
public static BinaryTree<Integer> generateBalancedIntegerTree( int pNodeCount, int pMinValue, int pMaxValue ) {
|
||||
return generateIntegerTree(pNodeCount, pMinValue, pMaxValue, 0.5, 0.0);
|
||||
}
|
||||
|
||||
public static BinaryTree<Integer> generateCompleteIntegerTree( int pDepth, int pMinValue, int pMaxValue ) {
|
||||
return generateBalancedIntegerTree((int)Math.pow(2,pDepth)-1, pMinValue, pMaxValue);
|
||||
}
|
||||
|
||||
public static BinaryTree<Integer> generateIntegerTree( int pNodeCount, double pWeight, double pUncertainty ) {
|
||||
return generateIntegerTree(pNodeCount, 0, 100, pWeight, pUncertainty);
|
||||
}
|
||||
|
||||
public static BinaryTree<Integer> generateIntegerTree( int pNodeCount, int pMinValue, int pMaxValue, double pWeight, double pUncertainty ) {
|
||||
final Random rand = new Random();
|
||||
return generateTree(pNodeCount, new Callable<Integer>() {
|
||||
@Override
|
||||
public Integer call() throws Exception {
|
||||
return new Integer(rand.nextInt(pMaxValue-pMinValue)+pMinValue);
|
||||
}
|
||||
}, pWeight, pUncertainty);
|
||||
}
|
||||
|
||||
public static BinaryTree<String> generateStringTree( int pNodeCount, double pWeight, double pUncertainty ) {
|
||||
return generateStringTree(pNodeCount, new String[]{"Jonas", "Martin", "Harald", "Sabine", "Feline", "Kathrin"}, pWeight, pUncertainty);
|
||||
}
|
||||
|
||||
public static BinaryTree<String> generateStringTree( int pNodeCount, final String[] pWords, double pWeight, double pUncertainty ) {
|
||||
final Random rand = new Random();
|
||||
return generateTree(pNodeCount, new Callable<String>() {
|
||||
@Override
|
||||
public String call() throws Exception {
|
||||
return pWords[rand.nextInt(pWords.length)];
|
||||
}
|
||||
}, pWeight, pUncertainty);
|
||||
}
|
||||
|
||||
public static <T> BinaryTree<T> generateTree( int pNodeCount, Callable<T> pGenerator, double pWeight, double pUncertainty ) {
|
||||
return generateTree(new BinaryTree<T>(), pNodeCount, pGenerator, pWeight, pUncertainty);
|
||||
}
|
||||
|
||||
public static <T> BinaryTree<T> generateTree( BinaryTree<T> pRoot, int pNodeCount, Callable<T> pGenerator, double pWeight, double pUncertainty ) {
|
||||
if( pNodeCount > 0 ) {
|
||||
try {
|
||||
pRoot.setContent(pGenerator.call());
|
||||
} catch( Exception ex ) {
|
||||
return pRoot;
|
||||
}
|
||||
|
||||
|
||||
double weight = pWeight + (pUncertainty - (Math.random() * pUncertainty * 2));
|
||||
weight = Math.min(1.0, Math.max(0.0, weight));
|
||||
int leftCount = (int) (pNodeCount * weight);
|
||||
int rightCount = pNodeCount - leftCount - 1;
|
||||
|
||||
generateTree(pRoot.getLeftTree(), leftCount, pGenerator, pWeight, pUncertainty);
|
||||
generateTree(pRoot.getRightTree(), rightCount, pGenerator, pWeight, pUncertainty);
|
||||
}
|
||||
return pRoot;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
#BlueJ package file
|
||||
dependency1.from=Trees
|
||||
dependency1.to=BinaryTree
|
||||
dependency1.type=UsesDependency
|
||||
dependency2.from=Traversierungen
|
||||
dependency2.to=BinaryTree
|
||||
dependency2.type=UsesDependency
|
||||
dependency3.from=Traversierungen
|
||||
dependency3.to=Trees
|
||||
dependency3.type=UsesDependency
|
||||
editor.fx.0.height=1026
|
||||
editor.fx.0.width=1696
|
||||
editor.fx.0.x=-8
|
||||
editor.fx.0.y=-8
|
||||
objectbench.height=130
|
||||
objectbench.width=1656
|
||||
package.divider.horizontal=0.6
|
||||
package.divider.vertical=0.8520518358531317
|
||||
package.editor.height=782
|
||||
package.editor.width=1545
|
||||
package.editor.x=0
|
||||
package.editor.y=0
|
||||
package.frame.height=1026
|
||||
package.frame.width=1696
|
||||
package.numDependencies=3
|
||||
package.numTargets=3
|
||||
package.showExtends=true
|
||||
package.showUses=true
|
||||
project.charset=UTF-8
|
||||
readme.height=58
|
||||
readme.name=@README
|
||||
readme.width=47
|
||||
readme.x=10
|
||||
readme.y=10
|
||||
target1.height=50
|
||||
target1.name=Traversierungen
|
||||
target1.showInterface=false
|
||||
target1.type=ClassTarget
|
||||
target1.width=130
|
||||
target1.x=140
|
||||
target1.y=200
|
||||
target2.height=50
|
||||
target2.name=Trees
|
||||
target2.showInterface=false
|
||||
target2.type=ClassTarget
|
||||
target2.width=80
|
||||
target2.x=680
|
||||
target2.y=290
|
||||
target3.height=50
|
||||
target3.name=BinaryTree
|
||||
target3.showInterface=false
|
||||
target3.type=ClassTarget
|
||||
target3.width=190
|
||||
target3.x=390
|
||||
target3.y=130
|
Loading…
Reference in New Issue