een knooppunt verwijdert uit een binaire zoekboom

stemmen
0

Mijn Binary Search Tree programma lijkt niet iets te schrappen van toen ik de deleteNode methode noemen. De BST is perfect gebouwd, het is gewoon het verwijderen van het knooppunt deel dat niet werkt. Ik noem het uit mijn hoofd als volgt uit:

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 mijn BinarySearchTree klasse implementeren ik mijn deleteNode methoden als volgt:

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();
        }
}
De vraag is gesteld op 08/10/2011 om 18:52
bron van user
In andere talen...                            


4 antwoorden

stemmen
0

Niet 100% zeker als dit je enige probleem, maar moet:

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

eigenlijk:

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

dwz u slechts één en voor de "en de" operatie wanneer je moet twee hebben?

antwoordde op 08/10/2011 om 19:25
bron van user

stemmen
2

Ik denk dat je niet de behandeling van de

Geval 1: waarbij het wissen knooppunt een bladknooppunt

geval 2: waarbij het wissen knooppunt slechts 1 kind


het anders indien een deel moet iets als dit.

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;

De findMin methode is het vinden van inorder opvolger van het knooppunt verwijderd.

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

Ik hoop dat dit antwoord op uw vraag.

antwoordde op 08/10/2011 om 20:39
bron van user

stemmen
1

Het schrijven van leesbare code maakt bugs gemakkelijker te herkennen - zowel jezelf en anderen. Een eerste stap is het kiezen van meer expressieve variabele namen dan temp, temp2en treeTemp.

Ook, het is echt niet nodig te doen new Integer(x)op een methode parameter van het type toe te wijzen int. Gewoon het schrijven van xhet hetzelfde effect plaats heeft, is sneller tijdens runtime, en maakt het gemakkelijker om de code die zaken te spotten.

Zoals voor bugs, de eerste die ik zie is:

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

Dat schept een kopie van de TreeNode. Het veranderen van die kopie heeft geen invloed op de oorspronkelijke knooppunt. Ook de kopie waarschijnlijk niet hebben leftof rightingesteld, omdat je pas over het valueaan de aannemer. Ik vraag me af waarom denk dat je een kopie nodig? Immers, je niet één hier ook te maken:

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

Vervolgens, zoals Sashwat opmerkt, wanneer de node te verwijderen heeft minder dan 2 kinderen, de code doet niets, aangezien geen van de omstandigheden in deleteNodewedstrijden.

antwoordde op 09/10/2011 om 00:01
bron van user

stemmen
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;
        }
  }
antwoordde op 29/01/2013 om 18:54
bron van user

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