List to BinaryTree

ramirez

Mitglied
Hi,
ich möchte eine Methode implementieren , die eine Liste bekommt und eine BinBaum<T> zurückgibt
ich habe schon eine BinBaum<T> Klasse geschrieben.

1.Frage: wie kann ich eine Liste zu einem Baum konvertieren ?
2.Frage: Wenn ich schon einen Baum gesetzt habe, gebe ich einfach die Referenzvariable auf die BinBaum<T> zurück ?:)
 
B

bERt0r

Gast
Du hast doch sicher eine Funktion add(T dings) oder einfuegen(T dings) in deiner BinBaum Klasse.
Also erstellst du einen neuen Baum, iterierst du die Liste durch, und fügst jedes Element der Reihe nach ein.
Java:
BinBaum<T> returnBaum=new Binbaum<T>();
Iterator it=listeVonTs.iterator();
while(it.hasNext())
{T teil=it.next();
returnBaum.add(teil);
}
return returnBaum;
 
R

ramirez0

Gast
Ich hab leider keine add-Methode in der BinBaum-Klasse, nur drei Konstruktoren von der Art:
BinBaum<T>()

BinBaum<T>(T t)

BinBaum<T>(BinBaum<T>, T t, BinBaum<T>)

Das heiß ich muss mir den Baum irgendwie aus den Konstruktoren zusammenbauen, nur wie?
 

Landei

Top Contributor
Theoretisch geht 1) schon ohne add-Methode in BinBaum selbst, nur dass dann die add-Methode sozusagen "extern" ist, mit Teil-Bäumen herumhantiert und die ganze Logistik selbst übernehmen muss. Es ist auch kein Problem, wenn der Baum unveränderlich ist.

Hübsches OO sieht aber anders aus.
 
Zuletzt bearbeitet:

Landei

Top Contributor
Der Beweis:

Java:
public class BinBaum<T> {
    
    private final T value;
    private final BinBaum<T> left, right;
    
    public BinBaum() {
        this(null);
    }        
    
    public BinBaum(T value) {
        this(null,value,null);
    }
    
    public BinBaum(BinBaum<T> left, T value, BinBaum<T> right) {
        this.left = left;
        this.value = value;
        this.right = right;
    }

    @Override
    public String toString() {
        String leftStr = left == null ? "" : left.toString();
        String rightStr = right == null ? "" : right.toString();
        return "(" + leftStr + value + rightStr + ")";
    }
    
}

Java:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class BinTest {
    public static void main(String[] args) {
        Random r = new Random();
        List<Integer> intList = new ArrayList<Integer>();
        for(int i = 0; i < 20; i++) {
            intList.add(r.nextInt(100));
        }
        System.out.println(intList);
        System.out.println(makeBin(intList));
    }
    
    public static BinBaum<Integer> makeBin(List<Integer> list) {
        if (list.isEmpty()) {
            return new BinBaum<Integer>();
        } else if (list.size() == 1) {
            return new BinBaum<Integer>(list.get(0));
        } else {
            int pivot = list.get(0);
            List<Integer> left = new ArrayList<Integer>();
            List<Integer> right = new ArrayList<Integer>();
            for(int i = 1; i < list.size(); i++) {
                (list.get(i) <= pivot ? left : right).add(list.get(i));
            }
            return new BinBaum<Integer>(makeBin(left), pivot, makeBin(right));
        }
    }
}

Ausgabe:
Code:
[45, 42, 87, 18, 33, 37, 70, 81, 32, 87, 65, 36, 70, 27, 18, 17, 27, 81, 74, 64]
(((((17)18(null))18((((27)27(null))32(null))33((36)37(null))))42(null))45((((64)65(70))70(((74)81(null))81(87)))87(null)))

Um Frage 2) zu beantworten, ja du gibst einfach eine Referenz zurück, genau wie es in meinem Code die Methode makeBin tut.
 
Zuletzt bearbeitet:
B

bERt0r

Gast
Landei, was du hier BinBaum nennst ist kein Baum sondern ein Knoten. Der ganze OO-Sinn hinter einer Klasse die BinBaum heisst ist der, dass sie sich um die Einfüge, Such und Entfernungsmechanismen kümmern soll. Solche "Lösungsvorschläge" sind für Anfänger gefährlich, sowas lernt man sich falsch ein und dann steht man irgendwann vor einer Wand.
 

Landei

Top Contributor
Du irrst dich, genau so werden unveränderliche Bäume definiert.

Siehe z.B. hier: Immutability in C# Part Six: A Simple Binary Tree - Fabulous Adventures In Coding - Site Home - MSDN Blogs oder hier: Tree Tutorial - Progzoo
Binary Tree, nicht "Binary Node" oder so...

Veränderliche Bäume sehen natürlich anders aus, und ihre Knoten ähneln unveränderlichen Bäumen (nur dass die Knoten eben veränderlich sind). Das ändert aber nichts an der Tatsache...

Dass das kein schönes OO ist, habe ich schon geschrieben. Funktionieren tut es trotzdem. Und wenn der TO schreibt, seine BinBaum-Klasse hat keine add-Methode, muss ich halt davon ausgehen.
 
Zuletzt bearbeitet:
B

bERt0r

Gast
Es ging mir hier gar nicht darum, ob man in c# so unveränderliche Bäume konstruiert, oder jeglichen "Blödsinn" den ihr mir hier unterstellt.
Mir ging es nur darum, dass es gefährlich ist, mit so einer absolut nicht objektorientierten Lösung daherzukommen, bevor der TO nicht genau sowas fordert. Ramirez hat nicht erwähnt dass der Binärbaum unveränderlich sein soll.
Er hat auch gesagt er hat die Klasse selbst geschrieben, also wird die nicht schon vorgegeben sein.
Ich bestreite ja gar nicht dass dein Code funktioniert ist, und du sagst ja auch selber dass es nicht schönes OO ist, meine Aussage bezog sich darauf, dass jemand der Java gerade lernt es eben nicht so, sondern objektorientiert lernen sollte. Eine Binärbaum Bearbeitung wie du sie gezeigt hast, ist mir nur mehr aus Pascal-Zeiten in Erinnerung.
 

Landei

Top Contributor
Eine Binärbaum Bearbeitung wie du sie gezeigt hast, ist mir nur mehr aus Pascal-Zeiten in Erinnerung.

Das ist schade. Pascal hat einiges richtig gemacht, was C und C++ falsch gemacht haben, wobei es allerdings etwas zu konservativ war. Aber man kann auch in Pascal gute Programme schreiben.

Der Stil meines Beispiels ist nicht imperativ, er ist funktional, und ist ganz normal in Sprachen wie Haskell oder Scala. Dass das in Java nicht "schön" aussieht, ist größtenteils der Fehler von Java, denn in anderen OO-Sprachen mit funktionalen Elementen (C#, Python, Ruby...) könnte man es durchaus "hübsch" machen - und ebenso in Java 8.

OO ist keine heilige Kuh, es löst einige Probleme, und schafft ein paar andere, darunter ziemlich haarige. Der hier gezeigte Stil kann z.B. in einer heterogenen Baumstruktur der "OO-Lösung" (sowohl der normalen Implementierung wie auch dem abscheulichen Visitor Pattern) überlegen sein.

Was man den Anfängern wirklich beibringen sollte ist, dass in der IT jede Art von Dogmatismus fehl am Platz ist - denn wenn sie erst einmal auf die Menschheit losgelassen werden, wird weder OO- noch funktionionale Programmierung noch so wie heute aussehen.
 

Landei

Top Contributor
Um den Punkt zu verdeutlichen, wie elegant diese Lösung im Kern eigentlich ist, hier exakt der gleiche Code in Haskell, inklusive der drei unterschiedlichen Konstruktoren (die hier aber unterschiedliche Namen bekommen müssen):

Code:
data BinBaum a = Branch a (BinBaum a) (BinBaum a) 
                 | Leaf a 
                 | Nil 
                 deriving Show

makeBin [] = Nil
makeBin [x] = Leaf x
makeBin (x:xs) = Branch x left right where
    left = makeBin $ filter (<= x) xs
    right = makeBin $ filter (> x) xs

Auf unsere Beispieldaten angewandt:
Code:
Branch 45 (Branch 42 (Branch 18 (Branch 18 (Leaf 17) Nil) (Branch 33 (Branch 32 (Branch 27 (Leaf 27) Nil) Nil) (Branch 37 (Leaf 36) Nil))) Nil) (Branch 87 (Branch 70 (Branch 65 (Leaf 64) (Leaf 70)) (Branch 81 (Branch 81 (Leaf 74) Nil) (Leaf 87))) Nil)

Denkst du, man (und das schließt Anfänger ein) sollte solche Techniken nicht kennen, nur weil sie nicht "OO" genug sind?
 
Zuletzt bearbeitet:

Dekker

Bekanntes Mitglied
...
Denkst du, man (und das schließt Anfänger ein) sollte solche Techniken nicht kennen, nur weil sie nicht "OO" genug sind?

Um das mal vorweg zu nehmen. Der Stil den man da benutzt der ähnelt auch sehr den von funktionalen Programmiersprachen.
Es ist eigentlich egal in welchem Stadium des lernens man ist, im Grunde genommen sollte man alle diese Techniken zumindest mal gesehen haben. Beides hat an bestimmten Stellen seine Vor- und Nachteile.

Wobei ich ehrlich sagen muss, von alleine wäre ich nie auf die Idee gekommen das so zu Implementieren. Man stumpft irgendwie gegen solche Lösungen ab und sucht irgendwie immer erstmal nach einer OO Lösung. Ka wies den anderen hier geht, aber fällt mir an mir immer wieder auf :oops:
 

diggaa1984

Top Contributor
kommt mir ja schwer bekannt vor die aufgabe :D

man kann das per rekursion lösen wenn man sich daran hält, dass zu einem Listenindex i, dessen Element den Inhalt des Wurzelknotens eines BinBaumes darstellt, das Listenelement 2*i den Wurzelknoten des linken Unterbaumes und das Listenelement (2*i)+1 den Wurzelknoten des rechten Unterbaumes darstellt.

für i >= 1 .. das heisst, da muss man diesen Bereich noch auf die eigentlichen Indizes der Listen (beginnend bei 0) mappen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
J Array.list vergleichen Java Basics - Anfänger-Themen 1
B Vektor vs List Java Basics - Anfänger-Themen 4
volcanos Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>() Java Basics - Anfänger-Themen 14
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
T Linked List set-Methode Java Basics - Anfänger-Themen 2
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
L Datentypen Array List Java Basics - Anfänger-Themen 9
J Java List, Bitte um Hilfe Java Basics - Anfänger-Themen 15
J Java List, bitte um Hilfe Java Basics - Anfänger-Themen 3
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
G Linked list, Methode zum Vertauschen von Elementen Java Basics - Anfänger-Themen 14
I csv auslesen, mittels List Java Basics - Anfänger-Themen 18
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
W Stream Array List - Frage Java Basics - Anfänger-Themen 5
E Interface List nicht als Collection an erkannt. Java Basics - Anfänger-Themen 14
X Array List geordnet ausgeben. (JSF und JAVA) Java Basics - Anfänger-Themen 1
D new arraylist (List) dynamisch erstellen Java Basics - Anfänger-Themen 1
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
M List<String> auswählen Java Basics - Anfänger-Themen 42
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
T HashSet in List-Object Java Basics - Anfänger-Themen 5
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
E Array-list mit einer bestimmten Länge Java Basics - Anfänger-Themen 17
B Sorting List und Remove Java Basics - Anfänger-Themen 2
B String: suche nach Wörter und in List<String> speichern Java Basics - Anfänger-Themen 3
M Methode überladen - Array List Java Basics - Anfänger-Themen 5
L LIST.ADD Java Basics - Anfänger-Themen 2
M XWPF - Bullet Point list erstellen Java Basics - Anfänger-Themen 1
I <List> sortieren Java Basics - Anfänger-Themen 2
N Klassen List-Art Java Basics - Anfänger-Themen 5
S List<T<X,Y> sortieren Java Basics - Anfänger-Themen 5
Salo Datentypen "Doppelt" List(e) ("gesucht") Java Basics - Anfänger-Themen 6
F .csv Export aus einer list Java Basics - Anfänger-Themen 25
T KlausurÜbung- Förderband-Linked List Java Basics - Anfänger-Themen 53
D Komischer Fehler nach <Integer> List Java Basics - Anfänger-Themen 2
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
T List und ArrayList Java Basics - Anfänger-Themen 3
UnityFriday method getPrevious in class List<ContentType> cannot be applied to given types Java Basics - Anfänger-Themen 29
hooked Verkettete Liste / linked list Java Basics - Anfänger-Themen 2
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
D Input/Output CSV Parser list unvollständig Java Basics - Anfänger-Themen 25
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
S Methoden Linked List Methoden können nicht aufgerufen werden Java Basics - Anfänger-Themen 1
U JAXB - List wird nicht ausgefüllt Java Basics - Anfänger-Themen 1
L Linked List - Array List Java Basics - Anfänger-Themen 2
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
D Bestimmten Wert aus Array List ausgeben Java Basics - Anfänger-Themen 7
V Personenverwaltung mit List<>, falsche Ausgaben Java Basics - Anfänger-Themen 5
M List befüllen Java Basics - Anfänger-Themen 3
S Datentypen List.toString wirft NullPointerException Java Basics - Anfänger-Themen 5
P Anlegen und Abfragen von Array List Java Basics - Anfänger-Themen 4
S Element von List<E> in String umwandeln Java Basics - Anfänger-Themen 3
A Wie nutze ich List<List<String>> Java Basics - Anfänger-Themen 4
M Endlos schleife in List Java Basics - Anfänger-Themen 5
P Zufallszahlen ohne zahlen einer List Java Basics - Anfänger-Themen 21
C Array List mit String vergleichen und Fehlermeldung ausgeben Java Basics - Anfänger-Themen 6
S Probleme bei Ausgabe von rekursiver Methode (List) Java Basics - Anfänger-Themen 16
T Tabstopp in AWT-List? Java Basics - Anfänger-Themen 8
P Doppelte Einträge in eine List Java Basics - Anfänger-Themen 5
M Wozu Upcasting? Am Beispiel List = ArrayList Java Basics - Anfänger-Themen 2
A List mit integern füllen Java Basics - Anfänger-Themen 4
D sortieren von List<> Java Basics - Anfänger-Themen 2
B List - Drag&Drop Java Basics - Anfänger-Themen 8
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
G Linked List Programm add Problem Java Basics - Anfänger-Themen 5
C List Abfragenproblem Java Basics - Anfänger-Themen 3
J List als anonyme Klasse Java Basics - Anfänger-Themen 9
H Collections List in List<SpecificType> als stat. generische Methode zurückgeben Java Basics - Anfänger-Themen 4
F Wozu braucht man array list? Java Basics - Anfänger-Themen 29
T Collections Wie funktioniert List() ? Java Basics - Anfänger-Themen 7
Kenan89 Java Date List Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
K Frage Set List Java Basics - Anfänger-Themen 3
M Array List ausgeben Java Basics - Anfänger-Themen 13
C Typen aus List<Object[]> ändern Java Basics - Anfänger-Themen 7
S Gute List Implementation Java Basics - Anfänger-Themen 5
S Synchronisieren einer Linked List Java Basics - Anfänger-Themen 16
A List Array - wie instanzieren Java Basics - Anfänger-Themen 7
T List mit mehreren gleichen Strings bereinigen Java Basics - Anfänger-Themen 4
P Set mit List vergleichen Java Basics - Anfänger-Themen 8
Binary.Coder List bzw. ArrayList als String ausgeben Java Basics - Anfänger-Themen 2
J Datentypen List - gleiche Einträge bei neuen Objekten Java Basics - Anfänger-Themen 31
T List.add(Object) führt zu NullPointerException Java Basics - Anfänger-Themen 14
M Collections Cast bei ArrayList (List) Java Basics - Anfänger-Themen 2
B List list - anstatt ArrayList list = new ArrayList Java Basics - Anfänger-Themen 10
H Remove Methode von List Java Basics - Anfänger-Themen 6
T Datentypen List<?> Java Basics - Anfänger-Themen 5
E Linked List generisch Java Basics - Anfänger-Themen 5
S Einen neuen String ohne Array oder List erzeugen??? Java Basics - Anfänger-Themen 13
S List angaben in textfelder Java Basics - Anfänger-Themen 7
D List<String[]> initialisieren Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben