Binärbäume knoten zählen

Sandro95

Bekanntes Mitglied
Guten Tag leute ,
ich benötige mal eure Hilfe und zwarhabe ich die Aufgabe bekommen in einem Binärenbaum die Knoten zu zählen .
Dabei hatte ich die idee , in der methode berechneKnotenanz eine zählervar. zu deklarieren, den Baum in in Order durchzulaufen und den zähler zu erhöhen.
Das läuft aberiwie nicht .. könnte mir vlt wer helfen ?
 

mihe7

Top Contributor
Wenn Du einen beliebigen Knoten nimmst und diesen als Wurzel eines Baums betrachtest, dann ist die Anzahl der Knoten in diesem Baum gleich der Summe der Anzahl der Knoten im linken sowie rechten Teilbaum zzgl. 1 für den Wurzelknoten...
 

Sandro95

Bekanntes Mitglied
@mihe7
aber wie implementiere ich das am besten?
ich habe zb die methode public void berechneAnzKnoten(Node node){
den baum traversieren :

if(node!=null) {

traversInOrder(node.leftNode);
System.out.println(node.wert );
traversInOrder(node.rightNode);
}

und dann ?
 

insert2020

Aktives Mitglied
Man könnte den Spaß noch etwas optimieren. ;)
Java:
int countNodes(Node node) {
    int i = (node.leftNode == null ? 0 : 1) + (node.rightNode == null ? 0 : 1);
    if (node.leftNode != null)
        i +=  countNodes(node.leftNode);
    if (node.rightNode != null)
        i +=  countNodes(node.rightNode);
    return i;
}
 

Sandro95

Bekanntes Mitglied
@insert2020 "
int i = (node.leftNode == null ? 0 : 1) + (node.rightNode == null ? 0 : 1);


"

wie habe ich die zeile zu verstehen ? so eine schreibweise ist mir neu hatte ich bis dato noch nicht in der uni
 

TM69

Bekanntes Mitglied
Guten Tag leute ,
ich benötige mal eure Hilfe und zwarhabe ich die Aufgabe bekommen in einem Binärenbaum die Knoten zu zählen .
Dabei hatte ich die idee , in der methode berechneKnotenanz eine zählervar. zu deklarieren, den Baum in in Order durchzulaufen und den zähler zu erhöhen.
Das läuft aberiwie nicht .. könnte mir vlt wer helfen ?
Man kann es auch noch ganz einfacher haben, wie z.B. Nested Sets bei Datenbanken. http://www.klempert.de/nested_sets/
 

affot

Mitglied
wie habe ich die zeile zu verstehen ? so eine schreibweise ist mir neu hatte ich bis dato noch nicht in der uni

Das ist eine verkürzte Schreibweise, aber genau das gleiche wie ne IF-Anweisung.

Java:
int i
if(node.leftNode == null){
    i=0;
}else{
    i=1;
}
 

Sandro95

Bekanntes Mitglied
ich danke euch für eure Hilfe ! aber @affot wenn ich i=1 zuweise im else , dann addiere ich die Nodes doch nicht hinzu sondern sage immer wieder das i =1 ist ?
 

affot

Mitglied
ich danke euch für eure Hilfe ! aber @affot wenn ich i=1 zuweise im else , dann addiere ich die Nodes doch nicht hinzu sondern sage immer wieder das i =1 ist ?

Oh, ja da habe ich das + übersehen.
Also nochmal anders ausgedrückt, der Ausdruck macht einfach nur:
Bedingung=true ? JA : NEIN

Das heißt wenn links und rechts != null, dann steht doch 1 + 1, wenn links = null dann 1 + 0 und wenn beide = null dann 0 + 0.
Und das wird halt i zugewiesen.
 

mihe7

Top Contributor
Das heißt wenn links und rechts != null, dann steht doch 1 + 1, wenn links = null dann 1 + 0 und wenn beide = null dann 0 + 0.
Und das wird halt i zugewiesen.
Ja. Mal ein einfaches, leicht verkürztes Beispiel einer rekursiven Funktion.
Java:
public int f(int x) {
    if (x <= 1) return 1;
    return x*f(x-1);
}

Was passiert, wenn Du f(4) aufrufst? Naja, es wird das Ergebnis von 4*f(3) zurückgegeben. Um das Ergebnis zu berechnen bräuchten wir f(3)... das wiederum das Ergebnis von 3*f(2) ist. f(2) .. Ergebnis von 2*f(1). f(1)? Ah, ist 1. Und jetzt können wir die Ergebnisse wieder berechnen:
f(2) = 2*f(1) = 2*1 = 2
f(3) = 3*f(2) = 3*2 = 6
f(4) = 4*f(3) = 4*6 = 24

Genau das gleiche passiert beim Zählen der Knoten. Nehmen wir mal einen Baum an, wie unter https://de.wikipedia.org/wiki/Binärbaum#/media/Datei:Binary_tree_array_indices.svg gezeigt.

Wenn Du countNodes für Knoten 1 aufrufst, was berechnet die Funktion?

countNodes(n1) = 1 + countNodes(n2) + countNodes(n3)

Was liefert countNodes(n2)?

countNodes(n2) = 1 + countNodes(n4) + countNodes(n5)
countNodes(n4) = 1 + countNodes(null) + countNodes(null) = 1+0+0 = 1
countNodes(n5) = 1 + countNodes(null) + countNodes(null) = 1+0+0 = 1
Damit ist countNodes(n2) = 1 + 1 + 1 = 3

Somit wird aus countNodes(n1) = 1 + countNodes(n2) + countNodes(n3) schon einmal countNodes(n1) = 1 + 3 + countNodes(n3).

Was liefert countNodes(n3)?

countNodes(n3) = 1 + countNodes(n6) + countNodes(n7)
countNodes(n6) = 1 + countNodes(null) + countNodes(null) = 1+0+0 = 1
countNodes(n7) = 1 + countNodes(null) + countNodes(null) = 1+0+0 = 1

Damit ist countNodes(n3) = 1 + 1 + 1 = 3

Somit wird aus countNodes(n1) = 1 + 3 + countNodes(n3) = 1 + 3 + 3 = 7.

Was das i von @insert2020 betrifft: das ist eine lokale Variable, die für jeden Aufruf der Funktion separat existiert.
 

insert2020

Aktives Mitglied
Schauen wir uns die Methode nochmal im Detail an... Man hätte sie auch so schreiben können:
Java:
public class Node {
	Node left, right;

	public Node(Node l, Node r) {
		left = l;
		right = r;
	}

	int countChilds() {
		boolean downwardsLeft = left != null;
		boolean downwardsRight = right != null;
		int i = (downwardsLeft ? 1 : 0) + (downwardsRight ? 1 : 0);
		if (downwardsLeft)
			i += left.countChilds();
		if (downwardsRight)
			i += right.countChilds();
		return i;
	}

	public static void main(String[] args) {
		Node root = new Node(new Node(null, null), new Node(new Node(new Node(null, new Node(null, null)), null), null));
		// there are 6 times "new"...
		System.out.println(root.countChilds() + 1);
	}
}
Jetzt ist hoffentlich mal ersichtlich, wie sie funktioniert: Für einen aktuellen Knoten wird die Anzahl aller Kinder berechnet...

Aus diesem verrückten Konstrukt int i = (downwardsLeft ? 1 : 0) + (downwardsRight ? 1 : 0);, würde der Compiler wohl so etwas machen:
Java:
		int i = 0;
		if (downwardsLeft)
			i++;
		if (downwardsRight)
			i++;
also wenig Zauberei...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Binärbäume in linearer Präfix-Repräsentation Java Basics - Anfänger-Themen 2
S Binärbäume in Java Java Basics - Anfänger-Themen 1
N Algorithmus 2 Binärbäume vergleichen Java Basics - Anfänger-Themen 9
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
Cassy3 Binärer Suchbaum Knoten rauslöschen Java Basics - Anfänger-Themen 1
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
Y Knoten an einem gegebenen Index aus einer Liste entfernen. Java Basics - Anfänger-Themen 6
Y Wie greift man auf die Knoten in einem Binärbaum zu? Java Basics - Anfänger-Themen 5
J ActionListener von JCheckBox im Knoten von JTree funktioniert nicht Java Basics - Anfänger-Themen 2
T Collections Methode (Knoten hinzufügen) für Graphen Java Basics - Anfänger-Themen 32
H Knoten-Reihenfolge einer LinkedList invertieren Java Basics - Anfänger-Themen 11
G Binärer Suchbaum Knoten zählen Java Basics - Anfänger-Themen 1
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
O Suchbaum Elternknoten finden Level eines Knoten bestimmen Java Basics - Anfänger-Themen 24
O Knoten und Liste verarbeitung Java Basics - Anfänger-Themen 20
E Knoten eines Baumes unter Bedinung zählen Java Basics - Anfänger-Themen 2
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
L Baum Knoten zählen Java Basics - Anfänger-Themen 6
L B+Baum innere Knoten erstellen Java Basics - Anfänger-Themen 3
L Graphen: Anzahl Knoten // Knoten in Array speichern Java Basics - Anfänger-Themen 4
I Erste Schritte Referenz zum Knoten davor, in einer Liste Java Basics - Anfänger-Themen 4
J Max. Anzahl von Knoten im Binärbaum Java Basics - Anfänger-Themen 3
M Werte der Knoten in Binärbaum addieren (iterativ) Java Basics - Anfänger-Themen 6
S Baumstruktur: tiefsten Knoten finden Java Basics - Anfänger-Themen 3
B Methoden BinärBaum als String Knoten löschen Java Basics - Anfänger-Themen 5
J Baum Knoten löschen Java Basics - Anfänger-Themen 10
T Datentypen Knoten Großvater finden? Java Basics - Anfänger-Themen 12
S Methoden Abtrennen ab einem gegebenen Knoten eines Binärbaums Java Basics - Anfänger-Themen 4
M Binärbaum - Problem bei Knoten anhängen / löschen Java Basics - Anfänger-Themen 5
B JTree knoten wird nicht übernommen Java Basics - Anfänger-Themen 4
L BinärTree, Knoten löschen Java Basics - Anfänger-Themen 6
Luk10 Anzahl der Knoten in einem Baum ausgeben! Java Basics - Anfänger-Themen 6
T gebe mir den ersten eltern knoten Java Basics - Anfänger-Themen 3
K verkettete Listen - Klasse Knoten Java Basics - Anfänger-Themen 19
L LinkedList vorgänger Knoten zurück geben Java Basics - Anfänger-Themen 4
H B-Baum: Knoten Position als Parameter oder als Variable im Objekt? Java Basics - Anfänger-Themen 4
D An bestimmten Knoten einer Liste zugreifen Java Basics - Anfänger-Themen 4
S Binärbaum - Klasse Knoten - Methode Suchen Java Basics - Anfänger-Themen 5
M Nachbar von Knoten bestimmen Java Basics - Anfänger-Themen 8
0x7F800000 zwei adjazenzlisten für jeden knoten eines graphen sinnvoll? Java Basics - Anfänger-Themen 17
C Bäume in Java. Knoten in Array speichern Java Basics - Anfänger-Themen 3
G eine Knoten aus einem Baum löschen. [SOLVED] Java Basics - Anfänger-Themen 7
F JTree-Knoten (DefaultMutableTreeNode) formatieren ? Java Basics - Anfänger-Themen 3
Y JTree: ein Knoten als Objekt Java Basics - Anfänger-Themen 2
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
M Häufigkeit von Wörtern zählen Java Basics - Anfänger-Themen 6
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
S Java Methodenaufrufe zählen Java Basics - Anfänger-Themen 4
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
J Methoden Positive Werte zählen Java Basics - Anfänger-Themen 3
H Buchstaben zählen Java Basics - Anfänger-Themen 9
Poppigescorn Häufigkeit einer zahl zählen Java Basics - Anfänger-Themen 5
HighLife Bestimmte Werte aus Array zählen Java Basics - Anfänger-Themen 15
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
X Game of Life Nachbarn zählen Java Basics - Anfänger-Themen 20
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
K Counts zählen Java Basics - Anfänger-Themen 23
Kirby.exe Anzahl vorkommender Elemente im Array zählen Java Basics - Anfänger-Themen 9
J Zeichen im String zählen Java Basics - Anfänger-Themen 3
N Zeichen in einem Textfeld zählen und hinterlegen Java Basics - Anfänger-Themen 6
T x Schritte zählen Java Basics - Anfänger-Themen 18
P Schlüsselworte Zählen und Zuweisen von eingelesenen Zahlen Java Basics - Anfänger-Themen 1
A In einem String alle Eigennamen zählen Java Basics - Anfänger-Themen 6
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
S Zählen der Zeiger auf Objekte Java Basics - Anfänger-Themen 35
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
B Array - die Häufigkeit der Zahl zählen Java Basics - Anfänger-Themen 9
L Vorherige Objekte zählen und ausgeben Java Basics - Anfänger-Themen 11
L Diphthonge zählen... Java Basics - Anfänger-Themen 5
O ELOPS Zählen Java Basics - Anfänger-Themen 1
S Rekursives Zählen einer Zahl Java Basics - Anfänger-Themen 8
X Quick Sort - Vergleichsoperationen zählen Java Basics - Anfänger-Themen 0
K alle Vorkommen einer bestimmten Ziffer in einer Zahl zählen Java Basics - Anfänger-Themen 2
B Collections Java Wörter in String zählen und geordnet ausgeben Java Basics - Anfänger-Themen 10
O Großbuchstaben im Satz zählen Java Basics - Anfänger-Themen 6
S zahl hoch und runter zählen per button Java Basics - Anfänger-Themen 25
N Zählen von Rationalen Werten eines Arrays Java Basics - Anfänger-Themen 10
Y for-Schleife zählen Java Basics - Anfänger-Themen 6
K Probleme mit Sortieren und dem Zählen Java Basics - Anfänger-Themen 13
S Vererbung Objekte von Ober - und Unterklassen zählen Java Basics - Anfänger-Themen 3
F SubString in String zählen Java Basics - Anfänger-Themen 3
C Im Array zählen und verändern Java Basics - Anfänger-Themen 5
O Zählen der while-Scheife Java Basics - Anfänger-Themen 3
P bytes aus einem InputStream zählen Java Basics - Anfänger-Themen 2
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
G Erste Schritte Einen Array absuchen und Buchstaben zählen Java Basics - Anfänger-Themen 17
F Problem mit Tabulatoren bei Zeilen zählen einer Textdatei Java Basics - Anfänger-Themen 17
F Textdatei einlesen und Zeilen zählen Java Basics - Anfänger-Themen 10
D Groß/KleinBuchstaben zählen Java Basics - Anfänger-Themen 21
D Buchstabe zählen/mappen Java Basics - Anfänger-Themen 3
S Anzahl unterschiedlicher Elemente zählen Java Basics - Anfänger-Themen 4
M Hilfe bei Zählen von Farben? Java Basics - Anfänger-Themen 7
R Input/Output Tastenschläge einer Taste zählen Java Basics - Anfänger-Themen 14
J Schleifendurchläufe zählen Java Basics - Anfänger-Themen 4
B Zweidimensionales Array Elemente jeder Spalte zählen Java Basics - Anfänger-Themen 9
E Methoden Methodenaufrufe zählen Java Basics - Anfänger-Themen 11
T Leerzeichen zählen mit Rekursion Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben