He encontrado este código para el método de eliminación findMIn perezoso de árbol binario de búsqueda. En primer lugar, es correcta este método? Si se trata de lata alguien me lo explique por favor.
private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t )
{
if (t == null) return null;
BinaryNode<E> tmp= findMin(t.left); // get minimum from the left node
if (tmp != null) return tmp; // if mimimum is not null return minimmum
if (!t.deleted) return t; // if minimum is null in left node and t is not deleted
// return t then
return findMin(t.right); // if t is deleted and minimum of left node of t is null, then search in right side
}
He reescrito para incluir lo siguiente, pero no está funcionando.
private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t)
{
ArrayList<BinaryNode<AnyType>> trv = new ArrayList<BinaryNode<AnyType>>();
return findMinVal(t, trv);
}
private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t, ArrayList<BinaryNode<AnyType>> trv )
{
if(t == null) {
return t;
} else {
BinaryNode<AnyType> left= findMin(t.left);
if(!t.deleted) {
trv.add(t);
}
BinaryNode<AnyType> right= findMin(t.right);
return trv.get(0);
}
Esto puede tirar java.lang.IndexOutOfBoundsException, si mientras se hace trv.get(0)
ArrayList trv
tamaño es 0.
Con el fin de evitar que se puede comprobar que si el tamaño de la trv
no es 0, entonces puede volver primer elemento de esta lista nula en el interior o regrese findMin
función
Aquí está el código de actualización:
private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t, ArrayList<BinaryNode<AnyType>> trv )
{
if(t == null) {
return t;
} else {
BinaryNode<AnyType> left= findMin(t.left);
if(!t.deleted) {
trv.add(t);
}
BinaryNode<AnyType> right= findMin(t.right);
return trv.size()==0 ? null :trv.get(0);
}
}
Como, una mejora en lugar de regresar BinaryNode<AnyType>
a findMin
la función que puede volver vacío desde todos modos el resultado se almacena en trv
arrylist y en vez de comprobar cada vez que return trv.size()==0 ? null :trv.get(0);
el interior de findMin
la función (esto se comprueba por cada llamada recursiva), se puede comprobar sólo una vez en el interior función auxiliar.
Aquí se actualiza código optimizado:
private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t)
{
ArrayList<BinaryNode<AnyType>> trv = new ArrayList<BinaryNode<AnyType>>();
findMinVal(t, trv);
return trv.size()==0 ? null :trv.get(0);
}
private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t, ArrayList<BinaryNode<AnyType>> trv )
{
if(t!=null) {
findMin(t.left);
if(!t.deleted) {
trv.add(t);
}
findMin(t.right);
}
}
En el código anterior orignal dos si hay condiciones:
if (tmp != null) return tmp;
Esto se utiliza para imprimir el valor devuelto ya no estamos usando la clase ArrayList de estructura de datos en código orignal para almacenar el resultado tan pronto a medida que resultan de findMin
llamada recursiva que no es nulo estamos volviendo él.
if (!t.deleted) return t;
Esto se utiliza para la misma razón, ya que es utilizado por el código como if(!t.deleted) {trv.add(t)}
por ejemplo estamos comprobando si volvió findMin (izquierda) null
y si su nodo raíz no se elimina luego regresar ese nodo ya que los niños pequeños que este nodo raíz correctas y por lo tanto no hay necesidad para comprobar más.
Sin embargo, no hay uso de if (tmp != null) return tmp;
puesto de todos modos cada vez que se vaya a if (!t.deleted) return t;
y desde allí como resultado bien puede ser devuelto. Por lo que este first if
puede ser eliminado.