La eliminación de un nodo de un árbol de búsqueda binaria

votos
0

no parece mi programa de búsqueda binaria Árbol ser borrar nada cuando llamo el método deleteNode. El BST se construye perfectamente, es sólo la eliminación de la parte de nodo que no funciona. Lo llamo desde mi principal como esto:

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

En mi clase BinarySearchTree implemento mis métodos deleteNode de la siguiente manera:

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();
        }
}
Publicado el 08/10/2011 a las 18:52
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
0

No es 100% seguro de si este es el único problema, sino que debe:

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

ser en realidad:

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

es decir, que sólo tiene una y la "y" operación cuando debería tener dos?

Respondida el 08/10/2011 a las 19:25
fuente por usuario

votos
2

Creo que no se está manejando la

Caso 1: en el que el nodo de borrado es un nodo hoja

Caso 2: en el que el nodo de borrado tiene sólo 1 niño


la otra parte, si debe ser algo como esto.

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;

El método findMin es encontrar el sucesor finde del nodo que desea eliminar.

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

Espero que esto responde a su pregunta.

Respondida el 08/10/2011 a las 20:39
fuente por usuario

votos
1

Escribir código legible hace más fácil de detectar errores - tanto por sí mismo ya otros. Un primer paso es elegir los nombres de variables más expresivo que temp, temp2, y treeTemp.

Además, no es realmente lo necesite hacer new Integer(x)para asignar un parámetro de método de tipo int. Simplemente escribiendo xen su lugar tiene el mismo efecto, es más rápido en tiempo de ejecución, y hace que sea más fácil de detectar el código que importa.

En cuanto a los errores, el primero que veo es:

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

Eso crea una copia de la TreeNode. Cambiar esa copia no afectará al nodo original. Además, la copia probablemente no tiene lefto rightfija, ya que sólo pasa el valueal constructor. Me pregunto por qué cree que necesita una copia? Después de todo, no se crea una aquí, ya sea:

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

A continuación, como señala Sashwat, si el nodo a borrar tiene menos de 2 hijos, su código no hace nada, ya que ninguna de las condiciones en los deleteNodepartidos.

Respondida el 09/10/2011 a las 00:01
fuente por usuario

votos
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;
        }
  }
Respondida el 29/01/2013 a las 18:54
fuente por usuario

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