Baum.java

public class Baum {
  public BaumKnoten wurzel;

  // Konstruktor
  // legt gleich den Wurzelknoten an
  public Baum(String kind) {
    wurzel = new BaumKnoten(kind);
  }

  // öffentliche Methoden
  public boolean einfuegeMutter(String nameMutter, String nameKind) {
    return einfuegeMutter(wurzel, nameMutter, nameKind);
  }

  public boolean einfuegeVater(String nameVater, String nameKind) {
    return einfuegeVater(wurzel, nameVater,  nameKind);
  }

  public void print() {
    print(wurzel, 0);
  }

  // Hilfsmethoden
  private boolean einfuegeMutter(BaumKnoten s, String nameMutter, 
                                 String nameKind) {
    boolean gefunden;
   
    // suche Kind

    // ist es schon Knoten s?
    if (s.name.equals(nameKind)) {      // gefunden
      s.mutter = new BaumKnoten(nameMutter);  // Mutter eintragen
      return true;
    } 
    
    // oder ein Vorfahre mütterlicherseits ?
    if (s.mutter != null) {
      gefunden = einfuegeMutter(s.mutter, nameMutter, nameKind);
      if (gefunden) {
        return true;
      }
    }
    
    // oder ein Vorfahre väterlicherseits ?
    if (s.vater != null) {
      gefunden = einfuegeMutter(s.vater, nameMutter, nameKind);
      if (gefunden) {
        return true;
      }
    }
    
    // im Teilbaum s ist es nicht
    return false;
  }

  private boolean einfuegeVater(BaumKnoten s, String nameVater,
                                String nameKind) {
    boolean gefunden;
    
    // suche kind

    // ist es schon Knoten s?
    if (s.name.equals(nameKind)) {     // gefunden
      s.vater = new BaumKnoten(nameVater);   // Vater eintragen
      return true;
    } 
    
    // oder ein Vorfahre mütterlicherseits ?
    if (s.mutter != null) {
      gefunden = einfuegeVater(s.mutter, nameVater, nameKind);
      if (gefunden) {
        return true;
      }
    }
    
    // oder ein Vorfahre väterlicherseits ?
    if (s.vater != null) {
      gefunden = einfuegeVater(s.vater, nameVater, nameKind);
      if (gefunden) {
        return true;
      }
    }
    
    // im Teilbaum s ist es nicht
    return false;
  }

  private static int indentPrint = 3;  // Einrückung beim Ausdrucken

  void print(BaumKnoten s, int pos) {
    // drucke Baum unter s, um pos nach rechts eingerückt

    // erst pos Leerzeichen
    for (int i=0; i<pos; i++) {
       System.out.print(" ");
    }

    // dann den Namen
    System.out.println(s.name);

    // dann den Rest der Familie
    if (s.vater != null) {
      print(s.vater, pos + indentPrint);
    }
    if (s.mutter != null) {
      print(s.mutter, pos + indentPrint);
    }
  }

  public static void main(String[] args) {

    Baum family = new Baum("adam");

    family.einfuegeVater("brian", "adam");
    family.einfuegeMutter("daniela", "brian");
    family.einfuegeMutter("charlotte", "adam");
    family.einfuegeVater("edward", "charlotte");
    family.einfuegeMutter("fanny", "charlotte");
    family.einfuegeMutter("gwendolyn", "fanny");
    
    family.print();
  }
}