Binary Tree Búsqueda - Eliminar

votos
1

Estoy tratando de escribir un programa que se lleva en las cadenas y los coloca en un árbol binario de búsqueda en orden alfabético una vez que éstos se insertan en el árbol, un usuario solicita que se desea borrar una palabra, eliminando de este modo que el nodo del árbol, y luego de salida del árbol sin que el nodo de nuevo en orden.

Todo funciona para este hasta la función de eliminación, la función de borrado funciona, pero es muy raro cómo se borra. Creo que actualmente se elimina un lado completo del árbol, porque cuando se borra la última palabra, que por lo general funciona. Voy a subir mi función de eliminación y si se necesita más que puedo subir el resto de mi código.

¡Gracias!

template<typename T> void Delete(TreeNode<T>*& root, const T& data)
{
    if (root == NULL)
        return;
        if(data < root->Value)
            return Delete(root->Left, data);
        else if (root->Value > data)
            return Delete(root->Right, data);
        else
        {
            TreeNode<T>* old_root = root;
            if (root->Left == NULL)
            {
                root = root->Right;
            }
            else if (root->Right == NULL)
            {
                root = root->Left;
            }
            else
            {
                replace_parent(old_root, old_root->Left);
            }
            delete old_root;



    }

};

template<typename T> void replace_parent(TreeNode<T>*& old_root, TreeNode<T>*& root)
{
    if (root->Right != NULL)
    {
        replace_parent(old_root, root->Right);
    }
    else
    {
        old_root->Value = root->Value;
        old_root = root;
        root = root->Left;
    }
};
Publicado el 31/03/2011 a las 03:24
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Sus casos, ya sea para ser izquierda o derecha NULLson buenas. Sin embargo, la lógica de ninguno de ellos es NULL, por desgracia, fallando.

Si estoy leyendo su código (y la comprensión de la función replace_parent()correctamente, si ninguno de los árboles está vacía va a sustituir la raíz actual con Left.

Pregúntese - qué está pasando con los valores que están en el Rightsubárbol?

Lo que hay que hacer para eliminar un nodo es el siguiente:

  1. Introduzca uno de los subárboles. Parece que haya elegido su Leftsub-árbol, así que vamos a ir de allí.
  2. Sigue el contrario línea de ramas. En este ejemplo, seguir bajando los Rightsubárboles desde el original Left. Seguir adelante hasta que encuentre un nodo de hoja derecha (no hay Rightsubárboles; Leftestá bien)
  3. Recuerde que el valor de su derecho de la hoja en una tmpvariable.
  4. La transferencia de la hoja de la derecha Left(si NULLo no) a la posición de la derecha de la hoja.
  5. Tome el tmpvalor y ponerlo en su nodo original 'a eliminar'.
Respondida el 31/03/2011 a las 03:38
fuente por usuario

votos
2

Lacqui es correcto en sus puntos.

permítanme decir que si bien la supresión de un nodo que necesita para reemplazarlo con el nodo máximo en el sub-árbol izquierdo o del mínimo y, en el sub-árbol derecho. por ejemplo: si usted ve la imagen siguiente: introducir descripción de la imagen aquí

si desea borrar el nodo 90, es necesario tener cuidado de que lo sustituya, ya sea con 80 que es su nodo máximo en el subárbol izquierdo o el 92 que el nodo mínima en el sub-árbol derecho. se puede mantener ningún enfoque.

por lo que el algo será: teniendo en cuenta el árbol secundario hacia la izquierda:

-> si encuentra el nodo a borrar, navegue hasta el valor máximo en su sub-árbol izquierdo.

-> asignar izquierda del nodo como nodo 50 y el derecho a ser 150

-> hacer 75-> siguiente como nulo y eliminar 90

Respondida el 18/04/2011 a las 11:22
fuente por usuario

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