<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://sibiwiki.de/wiki/index.php?action=history&amp;feed=atom&amp;title=Bin%C3%A4rbaum</id>
	<title>Binärbaum - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://sibiwiki.de/wiki/index.php?action=history&amp;feed=atom&amp;title=Bin%C3%A4rbaum"/>
	<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum&amp;action=history"/>
	<updated>2026-10-31T18:52:19Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in sibiwiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum&amp;diff=29&amp;oldid=prev</id>
		<title>Akaibel: 1 Version importiert</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum&amp;diff=29&amp;oldid=prev"/>
		<updated>2026-10-27T17:44:41Z</updated>

		<summary type="html">&lt;p&gt;1 Version importiert&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 27. Oktober 2026, 17:44 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;de&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(kein Unterschied)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum&amp;diff=28&amp;oldid=prev</id>
		<title>sibiwikialt&gt;Akaibel: /* Levelorder-Traversierung (nur LK) */</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum&amp;diff=28&amp;oldid=prev"/>
		<updated>2023-01-18T15:45:18Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Levelorder-Traversierung (nur LK)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Datenstrukturen(IF)]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[File:Binary_Tree.png|thumb|Binärbaum mit Knotentypen |300px]]&lt;br /&gt;
[[File:Ahnenbaum.png|thumb|Ahnenbaum: Justus und seine Vorfahren|300px]]&lt;br /&gt;
[[File:Strukturbaum.jpg|thumb|Binärer Strukturbaum (12/4)+(2*3) |300px]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Diese Seite entspricht dem Abi 17 (und folgenden)&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Ein Binärbaum ist ein gewurzelter Baum, bei dem jeder Knoten keine (auch Blatt genannt), eine oder maximal zwei Teilbäume besitzt.&lt;br /&gt;
* Als Spezialfall des Binärbaumes gibt es den [[Binärer Suchbaum|Binären Suchbaum]].&lt;br /&gt;
* Wie &amp;#039;&amp;#039;&amp;#039;Methoden&amp;#039;&amp;#039;&amp;#039; für Binärbäume implementiert werden können, wird in folgendem Artikel erklärt: [[Binärbaum_(Methoden)]]&lt;br /&gt;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/XrsfRh5S2Vw Prinzip der Traversierungen &amp;#039;&amp;#039;Preorder&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Inorder&amp;#039;&amp;#039;]&lt;br /&gt;
* [https://youtu.be/SjniaclqvFs Levelorder-Traversierung: Prinzip und Implementierung]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
Kante, Knoten, Wurzel, Blatt, Tiefe, Traversierung (Inorder, Preorder, Levelorder), Rekursion, Abbruchbedingung, rekursiver Aufruf, Sachlogik, Rahmenmethode&lt;br /&gt;
&lt;br /&gt;
= Schnittstelle des Zentralabiturs =&lt;br /&gt;
&lt;br /&gt;
[[Medium:Dokumentation2017_BinaryTree.pdf‎|Binärbaum Schnittstelle des Zentralabiturs(PDF)‎]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;#039;red&amp;#039;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Wichtiger Hinweis:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In der Schnittstelle des Zentralabiturs wird immer davon ausgegangen, dass unter den &amp;quot;sichtbaren&amp;quot; Knoten von Bäumen noch &amp;#039;&amp;#039;&amp;#039;leere&amp;#039;&amp;#039;&amp;#039; Knoten sind. Das hat den enormen Vorteil, dass man beim rekursiven Durchlauf durch einen Baum mit isEmpty() abbrechen kann. &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Traversierung=&lt;br /&gt;
Traversierungen sind Methoden, um alle Knoten eines Baumes in eine Liste zu übertragen.&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/XrsfRh5S2Vw Erklärvideo: Prinzip der Traversierungen &amp;#039;&amp;#039;Preorder&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Inorder&amp;#039;&amp;#039;]&lt;br /&gt;
==Prinzip==&lt;br /&gt;
* Preorder: &amp;#039;&amp;#039;&amp;#039;Wurzel&amp;#039;&amp;#039;&amp;#039; -&amp;gt; Links -&amp;gt; Rechts&lt;br /&gt;
* Inorder: Links -&amp;gt; &amp;#039;&amp;#039;&amp;#039;Wurzel&amp;#039;&amp;#039;&amp;#039; -&amp;gt; Rechts &amp;lt;br&amp;gt;Für den Inorder-Durchlauf kann man den Baum &amp;quot;von links nach rechts&amp;quot; lesen. &amp;lt;br&amp;gt; Inorder gibt in Bäumen mit Suchbaumstruktur die Knoten sortiert zurück.&lt;br /&gt;
* Postorder: Links -&amp;gt; Rechts -&amp;gt; &amp;#039;&amp;#039;&amp;#039;Wurzel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Levelorder: Der Baum wird &amp;quot;schichtenweise&amp;quot; in eine Liste übertragen.&lt;br /&gt;
Preorder, Inorder und Postorder sind &amp;#039;&amp;#039;&amp;#039;Tiefendurchläufe&amp;#039;&amp;#039;&amp;#039;. Levelorder dagegen ist ein &amp;#039;&amp;#039;&amp;#039;Breitendurchlauf&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
==Beispiel: preorder-Traversierung==&lt;br /&gt;
Bei der preorder-Traversierung handelt es sich (genauso wie bei inorder und postorder) um eine &amp;#039;&amp;#039;&amp;#039;Tiefensuche&amp;#039;&amp;#039;&amp;#039;. D.h. es wird erst ein Teil des Baums bis ganz nach unten durchsucht, bevor die anderen Zweige drankommen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Preorder-Traversierung des Ahnenbaums:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Justus, Margit, Antonie, Robert, Werner, Elisabeth, Bernhard, Henry, Lotte, Heinz, Lotte&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementierung:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 public List&amp;lt;String&amp;gt; preorder(BinaryTree&amp;lt;String&amp;gt; pTree)&lt;br /&gt;
 {&lt;br /&gt;
    List&amp;lt;String&amp;gt; ergebnis = new List&amp;lt;&amp;gt;();&lt;br /&gt;
    // Abbruchbedingung&lt;br /&gt;
    if (pTree.isEmpty()){&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // Wurzelelement auslesen&lt;br /&gt;
    String wurzel = pTree.getContent();&lt;br /&gt;
   &lt;br /&gt;
    // rekursiver Aufruf: erst fuer links, dann fuer rechts&lt;br /&gt;
    List&amp;lt;String&amp;gt; linkeListe = preorder(pTree.getLeftTree()); &lt;br /&gt;
    List&amp;lt;String&amp;gt; rechteListe = preorder(pTree.getRightTree()); &lt;br /&gt;
    &lt;br /&gt;
    // das ergebnis zusammenbauen&lt;br /&gt;
    ergebnis.append(wurzel);&lt;br /&gt;
    ergebnis.concat(linkeListe);&lt;br /&gt;
    ergebnis.concat(rechteListe);&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Levelorder-Traversierung (nur LK)==&lt;br /&gt;
[[File:Ahnenbaum.png|thumb|Ahnenbaum: Beispiel für Levelorder: Ahnenbaum|300px]]&lt;br /&gt;
[https://youtu.be/SjniaclqvFs Erklärvideo: Prinzip und Implementierung der Levelorder-Traversierung]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Levelorder-Traversierung wird ein Binärbaum &amp;#039;&amp;#039;&amp;#039;schichtenweise&amp;#039;&amp;#039;&amp;#039; durchlaufen, d.h.:&lt;br /&gt;
* erst die Wurzel&lt;br /&gt;
* dann die Wurzeln der beiden Teilbäume&lt;br /&gt;
* usw.&lt;br /&gt;
Für den Ahnenbaum ergibt sich folgende Levelorder-Reihenfolge:&lt;br /&gt;
&lt;br /&gt;
Justus, Margit, Henry, Antonie, Werner, Lotte, Heinz, Robert, Elisabeth, Bernhard, Lotte.&lt;br /&gt;
&lt;br /&gt;
D.h. man erhält die Vorfahren generationsweise.&lt;br /&gt;
&lt;br /&gt;
Zur &amp;#039;&amp;#039;&amp;#039;Implementierungsstrategie&amp;#039;&amp;#039;&amp;#039; siehe &amp;#039;&amp;#039;&amp;#039;[[Binärbaum_(Methoden) ab Abi 2017#Linearisierung|Linearisierung]]&amp;#039;&amp;#039;&amp;#039; im Artikel [[Binärbaum_(Methoden) ab Abi 2017|Binärbaum_(Methoden)]].&lt;br /&gt;
&lt;br /&gt;
=weitere Methoden=&lt;br /&gt;
Implementierungen von weiteren Methoden finden sich hier:&lt;br /&gt;
&lt;br /&gt;
[[Binärbaum_(Methoden) ab Abi 2017]]&lt;br /&gt;
&lt;br /&gt;
=Binärbäume, die Objekte enthalten=&lt;br /&gt;
[[Datei:Implementationsdiagramm_Binaerbaum_Abi2017.png|529px|thumb|right|Implementationsdiagramm Personenverwaltung]]&lt;br /&gt;
In den Beispielen oben sind in Binärbäumen jeweils nur Objekte vom Typ &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt; oder vom Typ &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; enthalten.&lt;br /&gt;
&lt;br /&gt;
Häufig enthalten Binärbäume aber auch Objekte von selbstdefinierten Klassen. Wie man damit umgeht, soll anhand eines Binärbaumes dargestellt werden, der mit Objekten der Klasse &amp;lt;code&amp;gt;Person&amp;lt;/code&amp;gt; gefüllt ist (vgl. Implementationsdiagramm rechts).&lt;br /&gt;
&lt;br /&gt;
==Beispiel: Suchen nach Geburtsjahrgang==&lt;br /&gt;
Zu implementieren ist für die Klasse &amp;lt;code&amp;gt;Personenverwaltung&amp;lt;/code&amp;gt; eine Methode &amp;lt;code&amp;gt;personenAusJahr&amp;lt;/code&amp;gt;, der ein Jahr übergeben wird, und die dann aus dem Attribut &amp;lt;code&amp;gt;personenBaum&amp;lt;/code&amp;gt; alle Personen dieses Jahrganges heraussucht und in einer Liste zurückgibt. &lt;br /&gt;
&lt;br /&gt;
Die gewünschte Methode ist hier eine [[Binärbaum_(Methoden) ab Abi 2017#Rahmenmethode|Rahmenmethode]], die ihrerseits eine (private) rekursive Methode aufruft.&lt;br /&gt;
&lt;br /&gt;
==Rahmenmethode==&lt;br /&gt;
Häufig gibt es den folgenden Fall: &lt;br /&gt;
* Ein Attribut einer Klasse muss rekursiv durchsucht werden, wie z.B. oben das Attribut &amp;lt;code&amp;gt;personenBaum&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Die gewünschte Methode ist aber nicht rekursiv ist (wie z.B. die Methode &amp;lt;code&amp;gt;public List personenAusJahr(int pGeburtsjahr)&amp;lt;/code&amp;gt; ).&lt;br /&gt;
&lt;br /&gt;
Dann macht man die gewünschte Methode zur &amp;#039;&amp;#039;&amp;#039;Rahmenmethode&amp;#039;&amp;#039;&amp;#039;, die ihrerseits eine private rekursive Methode aufruft.&lt;br /&gt;
&lt;br /&gt;
==Implementierung==&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 public class Personenverwaltung{&lt;br /&gt;
 &lt;br /&gt;
  // Attribut zur Verwaltung der Personen&lt;br /&gt;
  &amp;lt;b&amp;gt;private BinaryTree&amp;lt;Person&amp;gt; personenBaum;&amp;lt;/b&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  // *** Konstruktor&lt;br /&gt;
  public Personenverwaltung(){&lt;br /&gt;
     // hier wird personenBaum initialisiert&lt;br /&gt;
     // und mit Personen gefuellt&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // &amp;lt;b&amp;gt;Rahmenmethode&amp;lt;/b&amp;gt;&lt;br /&gt;
  &amp;lt;b&amp;gt;public List&amp;lt;Person&amp;gt; personenAusJahr(int pGeburtsjahr){&amp;lt;/b&amp;gt;&lt;br /&gt;
    List&amp;lt;Person&amp;gt; ergebnis = personenAusJahr(personenBaum, pGeburtsjahr);&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // rekursive Methode&lt;br /&gt;
  &amp;lt;b&amp;gt;private List&amp;lt;Person&amp;gt; personenAusJahr(BinaryTree&amp;lt;Person&amp;gt; pTree, int pGeburtsjahr){&amp;lt;/b&amp;gt;&lt;br /&gt;
    List&amp;lt;Person&amp;gt; ergebnis = new List&amp;lt;&amp;gt;();&lt;br /&gt;
    //Abbruchbedingung: leerer Baum&lt;br /&gt;
    if(pTree.isEmpty()){&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    // die Wurzel des Baumes auslesen&lt;br /&gt;
    // und in ein Objekt vom Typ Person konvertieren&lt;br /&gt;
    &amp;lt;b&amp;gt;Person wurzelPerson = pTree.getContent();&amp;lt;/b&amp;gt;&lt;br /&gt;
    // Sachlogik: Vergleich des Geburtsjahres der wurzelPerson mit pGeburtsjahr&lt;br /&gt;
    if(wurzelPerson.getGeburtsjahr() == pGeburtsjahr){&lt;br /&gt;
       ergebnis.append(wurzelPerson);&lt;br /&gt;
    }&lt;br /&gt;
    // rekursive Aufrufe&lt;br /&gt;
    List&amp;lt;Person&amp;gt; ergebnisLinks = &amp;lt;b&amp;gt;personenAusJahr(pTree.getLeftTree(), pGeburtsjahr)&amp;lt;/b&amp;gt;;&lt;br /&gt;
    List&amp;lt;Person&amp;gt; ergebnisRechts = &amp;lt;b&amp;gt;personenAusJahr(pTree.getRightTree(), pGeburtsjahr)&amp;lt;/b&amp;gt;;&lt;br /&gt;
    // die Ergebnisse anhängen&lt;br /&gt;
    ergebnis.concat(ergebnisLinks);&lt;br /&gt;
    ergebnis.concat(ergebnisRechts);&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>sibiwikialt&gt;Akaibel</name></author>
	</entry>
</feed>