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. }