Christoph Heger: rekursive Baumstruktur

Hallo,

Ich habe eine Tabelle die so aussieht:

ID     Parent ID      Name
1          0         Lollo
2          1         Heinz
3          1         Klaus
4          1         Thomas
5          3         Anja

Die will ich jetz per Rekursion zu einem Baum ausgeben, aber mir fehlt die zündende Idee, kann mir jemand helfen?

MfG
Christoph

  1. yo,

    Die will ich jetz per Rekursion zu einem Baum ausgeben, aber mir fehlt die zündende Idee, kann mir jemand helfen?

    dann wollen wir mal zünden lassen, wobei der name eigentlich schon programm ist. alle datensätze auslesen und eine funktion (klasse ?)erstellen, die sich eventuell selbst aufruft, sprich rekursiv.

    Ilja

    1. yo,

      Die will ich jetz per Rekursion zu einem Baum ausgeben, aber mir fehlt die zündende Idee, kann mir jemand helfen?

      dann wollen wir mal zünden lassen, wobei der name eigentlich schon programm ist. alle datensätze auslesen und eine funktion (klasse ?)erstellen, die sich eventuell selbst aufruft, sprich rekursiv.

      Ilja

      Naja, soweit bin ich auch schon, nur das ich das problem hab das wenn sich die klasse selber aufruft ich es bisher nur geschafft habe an jeden unterknoten gleich viele weitere unterknoten ranzuhängen, aber nciht so das ich halt an einigen zweigen nur einen unterknoten hab und an andern mehrere.

      Was Rekursion ist weiss ich schon, aber wie ich das schaffen soll was ich grade beschrieben hab, das ist mein problem

      Bis denn
      Christoph

      1. yo,

        ich bin nicht so bewandert in der OOP, aber ich würde sagen, die methode ruft sich selber auf, nicht die klasse. der clou dabei ist, dass sich die methode solange selbst aufruft, die noch unterverzeichnisse vorhanden sind, also keine feste anzahl von aufrufen, sondern abhängig davon, ob es noch weitere unterverzeichnisse gibt. der ausstieg aus der rekursion wäre den, dass es keine weiteren unterverzeichnisse mehr gibt. allem in allem bist du damit unabhängig, von einer festen anzahl.

        Ilja

        1. Hi,
          Joa, das is mir schon alles klar, aber trotzdem danke für deine Hilfe, ob das jetzt Klasse oder methode ist, ist ja an und für sich auch egal, wenn dann hab ich die begrifflichkeiten durcheinandergeschmissen.
          MfG
          Christoph

  2. Hallo Christoph,

    Ich habe eine Tabelle die so aussieht:

    ID     Parent ID      Name
    1          0         Lollo
    2          1         Heinz
    3          1         Klaus
    4          1         Thomas
    5          3         Anja

    Was Du brauchst, ist also eine Methode, die einem Knoten alle
    Kinderknoten anhängt und sie rekursiv selbst aufruft.

    Ein Knoten wäre so etwas:

    class Node {

    //Konstruktor
      Node(Integer id, String name, List<Node> childs);

    //Eigenschaften des Objekts
      Integer id;
      String name;
      List<Node> childs;

    }

    Die Tabelle hat eine Methode, um alle Kinder eines Knotens zu bekommen (ich nenne sie hier mal getRows(Integer id)) sowie folgende Methoden um den Baum zu erzeugen:

    List<Node> getTree(Integer id) {
      List<Node> childs = new List<Node>();
      foreach(Row row: getRows(id)) {
         childs.add(new Node(row.id, row.name, getTree(row.id)));
      }
      return childs;
    }

    Node getTree() {
      return new Node(0, "ROOT", getChilds(0));
    }

    Das ist kein lauffähiges Java, aber wie man rekursiv einen Baum aus einer flachen Struktur erzeugt, dürfte ganz gut erkennbar sein.

    Grüße

    Daniel

    1. Danke,
      ich denke das hat mir geholfen, dann mal frisch ans Werk.

      Bis denn
      Christoph

  3. Servus Christoph,
    rein vom Konzept her müsste Nachfolgendes funktionieren. Du setzt ein Startobjekt (in deinem Fall 'Lollo') und gehst durch alle Kindelemente. Sollten diese Elemente wiederum Kinder beinhalten, so rufe die Funktion rekursiv auf.
    Grüße Noodles

    P.S. ich hoffe du kannst den Code entsprechend umsetzen. Ich war zu faul ihn in Java zu implementieren und auszuprobieren *g*

    method main()
         entry = STARTOBJEKT
         recurseTree(entry)

    method recurseTree(entry)
         children[] = entry.getChildren()
         if children != null
              //Mach mit dem Kind was auch immer zu möchtest
              child...
              foreach child In children
                   recurseTree(child)