Binary Search Tree - Elimina

voti
1

Sto cercando di scrivere un programma che prende nelle stringhe e li inserisce in un albero binario di ricerca in ordine alfabetico una volta che questi sono inseriti nella struttura ad albero, un utente richiede una parola da eliminare, eliminando in tal modo che il nodo dall'albero, e poi uscita albero senza tale nodo in ordine.

Tutto funziona per questo fino alla funzione di eliminazione, la funzione di eliminazione funziona, ma è molto strano come si cancella. Credo che attualmente si elimina un intero lato della struttura, perché quando elimino l'ultima parola, funziona in genere. Io caricare la mia funzione di cancellazione e se è necessario più che posso caricare il resto del mio codice.

Grazie!

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;
    }
};
È pubblicato 31/03/2011 alle 03:24
fonte dall'utente
In altre lingue...                            


2 risposte

voti
1

I suoi casi sia per essere di sinistra o di destra NULLsono buone. Tuttavia, la logica per nessuno dei due di essere NULLè, purtroppo, venendo a mancare.

Se sto leggendo il codice (e la comprensione della funzione replace_parent()correttamente, quindi se nessuno albero è vuota si sta sostituendo la radice corrente con Left.

Chiedetevi - ciò che sta accadendo ai valori che si trovano nella Rightsotto-albero?

Quello che dovete fare per eliminare un nodo è la seguente:

  1. Inserire una delle sottostrutture. Sembra che tu hai scelto il tuo Leftsottostruttura, quindi dovremo passare da lì.
  2. Seguire la opposta linea di rami. In questo esempio, andare avanti verso il basso le Rightsottostrutture dall'originale Left. Continuate fino a trovare un nodo destro del foglio (non Rightsottostrutture; Leftè OK)
  3. Ricordate il valore del tuo diritto-foglia in un tmpvariabile.
  4. Trasferimento della destra-foglia Left(sia NULLo meno) alla posizione della destra-foglia.
  5. Prendete il tmpvalore e metterlo nella tua 'a-delete' nodo originale.
Risposto il 31/03/2011 a 03:38
fonte dall'utente

voti
2

Lacqui è corretto nei suoi punti.

lasciate che vi dica che durante l'eliminazione di un nodo è necessario sostituirlo con il nodo massimo nella struttura sub sinistra o punto di minimo nella struttura sub destra. per esempio: se si vede l'immagine qui sotto: entrare descrizione dell'immagine qui

se si desidera eliminare il nodo 90, è necessario fare in modo che non viene sostituito da uno di 80, che è il suo nodo max nel sottoalbero di sinistra o il 92 che il punto di minimo nella struttura sub destra. è possibile mantenere qualsiasi approccio.

in modo che l'algo sarà: considerando l'albero sub sinistra:

-> se si trova il nodo da eliminare, navigare fino al valore massimo nel suo albero sub sinistra.

-> assegnare sinistra del nodo 50 e il nodo diritto di essere 150

-> fare 75-> successivo come nullo e cancellare 90

Risposto il 18/04/2011 a 11:22
fonte dall'utente

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