Methoden Binärbaum Inorder Traversierung in Array speichern

void19

Neues Mitglied
Hallo,
ich bräuchte Hilfe bei einer Aufgabe. Wir sollen folgenden Code:
Java:
public void inorder() {
       if (!this.isEmpty()) {
           this.getLeft().inorder();
           System.out.print(this.getValue());
           this.getRight().inorder();
       }
   }
in eine Methode public Integer[] inorder() ändern, die die Werte nicht mehr auf die Konsole ausgibt, sondern in einem Array gepeichert. (this.getValue() liefert btw den Wert der Wurzel). Mein Versuch sieht bis jetzt so aus:

Java:
public Integer[] inorder() {
        ArrayList <Integer> tmp = new ArrayList<>();
        if(!this.isEmpty()) {
            this.getLeft().inorder();
            tmp.add(this.getValue());
            this.getRight().inorder();       
        }
        Integer[]inorder = new Integer[tmp.size()];
        tmp.toArray(inorder);
        //Ausgabe
        for(int i = 0; i<inorder.length; i++) {
            System.out.print(inorder[i] + " ");
        }
        return inorder;
    }

Aber es funktioniert leider nicht so ganz. Der Baum, mit dem ich die Methode getestet habe, sieht so aus:, d.h. eigentlich müsste die Ausgabe ja so aussehen: 3 2 5 4 6 7 9 8 10. Tatsächlich wird aber 3 2 5 4 6 9 8 10 ausgegeben, also es stimmt eigentlich alles bis auf dass die Wurzel fehlt. Kann mir jemand helfen, das zu beheben?

Schonmal Danke im Voraus. 🙂
dzkloztn95nnevlyj.jpg
 
Ich würde die Traversierungsmethode nur als interne Iteration definieren und die Aktion, die tatsächlich bei jedem Knoten angewandt werden soll, als externe Funktion/Consumer als Parameter reingeben.
Java:
import java.util.*;
import java.util.function.*;
public class Node<T> {
  T value;
  Node<T> left, right;
  Node(Node<T> l, T v, Node<T> r) {
    this.left = l;
    this.value = v;
    this.right = r;
  }
  Node(T v) {
    this.value = v;
  }
  void traverseInorder(Consumer<T> c) {
    if (left != null)
      left.traverseInorder(c);
    c.accept(value);
    if (right != null)
      right.traverseInorder(c);
  }
  public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    Node<Integer> root = new Node<>(
        new Node<>(
            new Node<>(3), 2, new Node<>(
                new Node<>(5), 4, new Node<>(6))),
            7,
            new Node<>(new Node<>(9), 8, new Node<>(10))
        );
    root.traverseInorder(v -> list.add(v));
    System.out.println(list);
  }
}
 

Neue Themen


Zurück
Oben