Ejemplo n.º 1
0
  public MutableTree sortedDelete(MutableTree root, int deleteVal) {
    if (root == null) return null;

    if (root.getValue() == deleteVal) { // wurzel soll geloescht werden
      if (root.getLeft() == null && root.getRight() == null) { // nur root
        // leeren baum zurueckgeben
        return null;
      } // else { //wurzel hat kinder
      // root = root.copy(); //ab hier brauchen wir eine kopie

      if (root.getRight() != null) { // rechter teilbaum vorhanden.
        MutableTree rightMin = (MutableTree) root.getRight().getMin();

        // root.value = rightMin.value; //kleinstes Element in die Wurzel kopieren
        // root.right = sortedDelete(root.right, rightMin.value); //und aus rechtem teilbaum
        // loeschen

        MutableTree newRoot = new DavidMutableTree(rightMin.getValue());
        newRoot.setLeft(root.getLeft());
        newRoot.setRight(sortedDelete(root.getRight(), rightMin.getValue()));
        return newRoot;
      } // else { //kein rechter teilbaum
      // root = root.left; //loeschen "wie in liste"
      return root.getLeft();
      // }
      // der sonderfall (right != null && left==null) wird nicht betrachtet
      // so spaart man sich ein paar vergleiche, einigen dublicate code
      // mit einem kleinen risiko etwas mehraufwand zu betreiben
      // }
    } // else { //wurzel wird nicht geloescht
    MutableTree newRoot = new DavidMutableTree(root.getValue()); // kopie anlegen
    if (deleteVal < root.getValue()) { // element zum loeschen ist links
      newRoot.setLeft(sortedDelete(root.getLeft(), deleteVal)); // element links loeschen
      newRoot.setRight(root.getRight()); // rechts bleibt unveraendert
      return newRoot;
    } // else { //analog mit rechts
    newRoot.setRight(sortedDelete(root.getRight(), deleteVal));
    newRoot.setLeft(root.getLeft());
    return newRoot;
    // }

    // root = newRoot; //alte referenz mit neuem baum ueberschreiben
    // }
    // no return here, to ensure no altered tree is returned
    // return root; //root, den "neuen baum", zurueckgeben.
  }