Törlése csomópont bináris kereső fába

szavazat
0

Saját bináris keresés Fa program nem úgy tűnik, hogy törölni semmit, ha hívom a deleteNode módszer. A BST épül tökéletesen, annak csak törlésével csomópont részt, ami nem működik. Úgy hívom én fő, mint ez:

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

Az én BinarySearchTree I. osztályú végre én deleteNode módszerek, mint a következő:

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();
        }
}
A kérdést 08/10/2011 18:52
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
0

Nem 100% biztos, hogy ez az egyetlen probléma, hanem, hogy:

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

valójában:

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

azaz már csak egy-az „és a” művelet, ha kell két?

Válaszolt 08/10/2011 19:25
a forrás felhasználó

szavazat
2

Azt hiszem, ha nem kezeli a

1. eset: ha a törlés csomópont egy levél csomópont

2. eset: ha a törlés csomópont mindössze 1 gyerek


Az else if részt kell valami ilyesmi.

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;

A findMin módszer lényege, hogy megtalálják a inorder utódja a törlendő csomópontra.

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

Remélem, hogy ez a kérdés megválaszolásában.

Válaszolt 08/10/2011 20:39
a forrás felhasználó

szavazat
1

Írásban olvasható kódot teszi a hibákat könnyebb észrevenni - mind a magad és mások. Az első lépés választja kifejezőbb változó nevek, mint temp, temp2és treeTemp.

Továbbá, ez tényleg nem kell megadnia, hogy nem new Integer(x)kell hozzá egy módszert típusú paramétert int. Egyszerűen írás xhelyett ugyanaz a hatása, gyorsabb futás közben, és megkönnyíti a helyszínen a kódot, ami számít.

Ami a hibákat, az első, amit látok:

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

Ez létrehoz egy példányt a TreeNode. Változó, hogy másolat nem lesz hatással az eredeti csomópontra. Továbbá, a másolat valószínűleg nem rendelkezik left, vagy rightbeállítani, hiszen csak át a valuea kivitelező. Nem értem, miért gondolja, hogy szükség van egy példánya? Végtére is, hogy ne hozzon létre egyet itt vagy:

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

Továbbá, amint Sashwat rámutat, ha a csomópont törölni kevesebb mint 2 gyerek, a kódot nem csinál semmit, mivel sem a körülmények deleteNodemérkőzést.

Válaszolt 09/10/2011 00:01
a forrás felhasználó

szavazat
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;
        }
  }
Válaszolt 29/01/2013 18:54
a forrás felhasználó

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