Ștergerea unui nod dintr-un arbore binar de căutare

voturi
0

Programul meu binar de căutare copac nu pare a fi ștergerea nimic când am apela metoda deleteNode. BST este construit perfect, ei doar ștergerea părții nod care nu funcționează. Eu îi spun de la principala mea ca aceasta:

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());

În clasa mea BinarySearchTree am pune în aplicare metodele mele deleteNode, după cum urmează:

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();
        }
}
Întrebat 08/10/2011 la 18:52
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
0

Nu sunt 100% sigur dacă acest lucru este singura problemă, dar ar trebui:

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

de fapt, să fie:

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

de exemplu, aveți o singură & pentru „și“ operațiune atunci când ar trebui să aibă două?

Publicat 08/10/2011 la 19:25
sursa de către utilizator

voturi
2

Cred că nu sunt manipulați

Cazul 1: în cazul în care nodul de ștergere este un nod frunză

Cazul 2: în cazul în care nodul de ștergere are doar 1 copil


else în cazul în care o parte ar trebui să fie ceva de genul asta.

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;

Metoda findMin este de a găsi succesorul inordine al nodului care urmează să fie șters.

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

Sper că acest lucru răspunde la întrebarea dumneavoastră.

Publicat 08/10/2011 la 20:39
sursa de către utilizator

voturi
1

Scrierea de cod lizibil face ca bug - uri mai ușor de la fața locului - atât de unul singur și alții. Un prim pas este alegerea nume de variabile mai expresive decât temp, temp2și treeTemp.

De asemenea, este într - adevăr nu nevoiesă face new Integer(x)pentru a atribui un parametru metodă de tip int. Pur și simplu scris , în xschimb are același efect, este mai rapid la rulare, și o face mai ușor de la fața locului , codul care contează.

În ceea ce privește bug-uri, prima pe care am vedea este:

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

Aceasta creează o copie a TreeNode. Schimbarea acea copie nu va afecta nodul inițial. De asemenea, copia , probabil , nu are leftsau rightset, din moment ce treci doar valueconstructorului. Mă întreb de ce că ai nevoie de o copie? La urma urmei, nu creați unul aici , fie:

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

În continuare, după cum Sashwat arată, în cazul în care nodul pentru a șterge are mai puțin de 2 copii, codul dvs. nu face nimic, ca nici una dintre condițiile din deleteNodemeciuri.

Publicat 09/10/2011 la 00:01
sursa de către utilizator

voturi
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;
        }
  }
Publicat 29/01/2013 la 18:54
sursa de către utilizator

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