Löschen eines Knotens aus einem binären Suchbaum

stimmen
0

Mein binärer Suchbaum Programm scheint nicht etwas zu löschen, wenn ich die deleteNode Methode aufrufen. Die BST ist perfekt gebaut, es ist nur der Knoten Teil zu löschen, das nicht funktioniert. Ich nenne es von meinem Haupt wie folgt aus:

System.out.println(Please enter a number you would like to delete from the tree);
    temp = reader.nextLine();
    try {
        int numTemp = Integer.parseInt(temp);
        TreeNode treeTemp = bst.deleteNode(numTemp, bst.getRoot());
        bst.setRoot(treeTemp);
    }
    catch(Throwable e){
        System.err.println(e);
    }
    bst.printInBST(bst.getRoot());

In meiner BinarySearchTree Klasse implementieren ich meine deleteNode Methoden, wie folgend:

public TreeNode deleteNode(int x, TreeNode temp){
    if(temp != null){
        if(x > (int)((Integer)temp.getValue())){
            temp.setLeft(deleteNode(new Integer(x), temp.getLeft()));
        }
        else if(x < (int)((Integer)temp.getValue())){
            temp.setRight(deleteNode(new Integer(x), temp.getRight()));
        }
        else if(temp.getLeft() != null & temp.getRight() != null){
            TreeNode temp2 = new TreeNode(temp.getRight().getValue());
            while(temp2.getLeft() != null){
                temp2 = temp2.getLeft();
            }
            temp = temp2;
            temp.setRight(remove(temp.getRight()));
        }
    }
    return temp;
}
public TreeNode remove(TreeNode temp){
        if(temp.getLeft() != null){
            temp.setLeft(remove(temp.getLeft()));
            return temp;
        }
        else {
            return temp.getRight();
        }
}
Veröffentlicht am 08/10/2011 um 18:52
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
0

Nicht zu 100% sicher, ob dies Ihr Problem ist nur, aber soll:

else if(temp.getLeft() != null & temp.getRight() != null)

tatsächlich sein:

else if(temp.getLeft() != null && temp.getRight() != null)

dh Sie haben nur ein & für die „und“ Betrieb, wenn Sie müssen zwei?

Beantwortet am 08/10/2011 um 19:25
quelle vom benutzer

stimmen
2

Ich glaube, Sie sind Handling nicht die

1. Fall: wobei der Löschknoten ein Blattknoten

Fall 2: wo der Lösch Knoten nur 1 Kind


die sonst, wenn ein Teil sollte so etwas wie diese.

else if( temp.getLeft() != null && temp.getRight() != null ) // Two children
{
      temp.setValue( findMin( temp.getRight() ).getValue());
      temp.setRight ( deleteNode( temp.getValue(), temp.getRight() );
}
else
     temp = ( temp.getLeft() != null ) ? temp.getLeft() : temp.getRight();

return temp;

Die findMin Methode ist der Inorder Nachfolger des Knotens zu finden gelöscht werden.

private TreeNode findMin( TreeNode t )
{
        if( t == null )
            return null;
        else if( t.getLeft() == null )
            return t;
        return findMin( t.getLeft() );
}

Ich hoffe, Ihre Frage zu beantworten.

Beantwortet am 08/10/2011 um 20:39
quelle vom benutzer

stimmen
1

Schreiben lesbarer Code macht Fehler leichter zu erkennen - sowohl von sich selbst und andere. Ein erster Schritt ist die Auswahl ausdrucksvoller als Variablennamen temp, temp2und treeTemp.

Es ist auch wirklich nicht nötig zu tun , new Integer(x)ein Verfahren Parameter des Typs zuweisen int. Einfach zu schreiben , xanstatt die gleiche Wirkung hat, ist zur Laufzeit schneller und macht es leichter , den Code zu erkennen, worauf es ankommt.

Wie für Fehler, ist die erste, die ich sehe:

TreeNode temp2 = new TreeNode(temp.getRight().getValue());

Das schafft eine Kopie des TreeNode. Diese Kopie ändert nicht den ursprünglichen Knoten beeinflussen. Auch dann , wenn die Kopie wahrscheinlich nicht leftoder righteingestellt, da man nur den Pass valuean den Konstruktor. Ich frage mich , warum Sie eine Kopie benötigen? Immerhin schafft man nicht man hier entweder:

deleteNode(new Integer(x), temp.getRight())

Als nächstes, wie Sashwat weist darauf hin, wenn der Knoten weniger als 2 Kinder hat zu löschen, wird der Code nicht ausführen , da keine der Bedingungen in deleteNodeSpielen.

Beantwortet am 09/10/2011 um 00:01
quelle vom benutzer

stimmen
0
  public class BSTNode {

  public boolean remove(int value, BSTNode parent) {
        if (value < this.value) {
              if (left != null)
                    return left.remove(value, this);
              else
                    return false;
        } else if (value > this.value) {
              if (right != null)
                    return right.remove(value, this);
              else
                    return false;
        } else {
              if (left != null && right != null) {
                    this.value = right.minValue();
                    right.remove(this.value, this);
              } else if (parent.left == this) {
                    parent.left = (left != null) ? left : right;
              } else if (parent.right == this) {
                    parent.right = (left != null) ? left : right;
              }
              return true;
        }
  }
Beantwortet am 29/01/2013 um 18:54
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more