Binar copac Căutare - Ștergere

voturi
1

Am încercat să scrie un program care ia în șiruri și le plasează într-un arbore binar de căutare în ordine alfabetică odată ce acestea sunt inserate în copac, un utilizator solicită un cuvânt să fie șters, ștergând astfel acel nod din copac, și apoi ieșire copac fără acel nod din nou în ordine.

Totul funcționează pentru până la funcția de ștergere, funcția de ștergere nu funcționează, dar ei foarte ciudat cum se șterge. Cred că în prezent se șterge o parte plină de copac, pentru că atunci când am șterge ultimul cuvânt, funcționează în mod obișnuit. Voi încărca funcția mea de ștergere și, dacă este nevoie de mai multe pot încărca restul codul meu.

Mulțumiri!

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;
    }
};
Întrebat 31/03/2011 la 03:24
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
1

Solicitările pentru oricare dintre acestea având stânga sau dreapta NULLsunt bune. Cu toate acestea, logica pentru nici unul dintre ei fiind NULLeste, din păcate, în caz contrar.

Dacă am citit codul (și înțelegerea funcției replace_parent()corect, atunci în cazul în care nici copac este gol înlocuiți rădăcina curent cu Left.

Intreaba - te - ceea ce se întâmplă cu valorile care sunt în Rightsubarborele?

Ce trebuie să faceți pentru a șterge un nod este după cum urmează:

  1. Introduceți unul dintre subramificații. Se pare că ați ales Leftsubramificație, așa că vom merge de acolo.
  2. Urmați opus liniei de ramuri. În acest exemplu, păstrați merge în jos Rightsubramificații de original Left. Continuă până când găsiți un nod dreapta-frunze (fără Rightsubarbori, Lefteste OK)
  3. Amintiți - vă valoarea dreapta frunze într - o tmpvariabilă.
  4. Se transferă dreapta frunzei Left(indiferent dacă sunt NULLsau nu) în poziția din dreapta frunzei.
  5. Ia tmpvaloarea și puneți - l în „să-delete“ nodul original.
Publicat 31/03/2011 la 03:38
sursa de către utilizator

voturi
2

Lacqui este corect în punctele sale.

permiteți-mi să vă spun vă că în timp ce ștergerea unui nod trebuie să-l înlocuiți fie cu nodul maxim din arborele de sub stânga sau nodul minim în arborele de sub dreapta. de exemplu: dacă vedeți imaginea de mai jos: introduceți descrierea imaginii aici

dacă doriți să ștergeți nodul 90, trebuie să aibă grijă să-l înlocuiți fie cu 80, care este nodul său maxim în subarborele stâng sau 92 care nodul minim în arborele de sub dreapta. puteți păstra orice abordare.

astfel încât algo va fi: avand in vedere sub copac din stânga:

-> dacă găsiți nodul pentru a șterge, navigați la valoarea maximă în arborele său de sub stânga.

-> atribuie stânga nodului 50 și dreptul de nod să fie 150

-> face 75-> următoare, ca nulă și șterge 90

Publicat 18/04/2011 la 11:22
sursa de către utilizator

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