Usuwanie węzła z binarne drzewo poszukiwań

głosy
0

Mój program binarne drzewo poszukiwań nie wydaje się być usuwania czegokolwiek, kiedy wywołać metodę deleteNode. BST jest zbudowany idealnie, jej po prostu usuwając część węzła, który nie działa. Ja nazywam go z moich głównych takiego:

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

W mojej klasie BinarySearchTree zaimplementować moje metody deleteNode w następujący sposób:

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();
        }
}
Utwórz 08/10/2011 o 18:52
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
0

Nie 100% pewien, czy jest to tylko twój problem, ale powinien:

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

faktycznie:

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

czyli masz tylko jedno i za „i” Operacja kiedy powinien mieć dwa?

Odpowiedział 08/10/2011 o 19:25
źródło użytkownik

głosy
2

Myślę, że nie są posługiwania sie

Przypadek 1: gdzie węzeł jest węzłem usuwania liści

Przypadek 2: gdzie węzeł usuwanie ma tylko 1 dziecko


else jeśli część powinna być coś takiego.

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 jest znalezienie następcy Inorder węzła ma być usunięty.

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

Mam nadzieję, że odpowiedź na Twoje pytanie.

Odpowiedział 08/10/2011 o 20:39
źródło użytkownik

głosy
1

Pisanie kodu czytelnego sprawia, że łatwiej jest dostrzec błędy - zarówno przez siebie i innych. Pierwszym krokiem jest wybór bardziej wyraziste niż nazw zmiennych temp, temp2oraz treeTemp.

Ponadto, jest to naprawdę nie neccessary zrobić new Integer(x)przypisać parametr metody typu int. Po prostu pisząc xzamiast ma taki sam skutek, jest szybszy przy starcie i sprawia, że łatwiej rozpoznać kod, który liczy.

Co do błędów, pierwszy widzę to:

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

Który tworzy kopię TreeNode. Zmiana tej kopii nie będzie miało wpływu na oryginalny węzeł. Ponadto, kopia prawdopodobnie nie posiada leftlub rightustawione, skoro tylko przekazać valuedo konstruktora. Zastanawiam się, dlaczego uważasz, że potrzebujesz kopię? Po tym wszystkim, nie tworzą jednego tutaj albo:

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

Następnie, jak Sashwat zwraca uwagę, jeśli węzeł usunąć mniej niż 2 dzieci, Twój kod nie robić nic, ponieważ żaden z warunków w deleteNodemeczach.

Odpowiedział 09/10/2011 o 00:01
źródło użytkownik

głosy
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;
        }
  }
Odpowiedział 29/01/2013 o 18:54
źródło użytkownik

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