Procedura de ștergere pentru un binar de căutare copac

voturi
7

Luați în considerare procedura de ștergere pe un BST, atunci când nodul pentru a șterge are doi copii. Să presupunem că am înlocui întotdeauna cu nodul care deține cheia minim în subarborele sau dreapta.

Întrebarea este: este această procedură comutativă? Aceasta este, ștergerea x și y, apoi are același rezultat decât ștergerea mai întâi y și apoi x?

Cred că răspunsul este nu, dar eu nu pot găsi un contraexemplu, și nici nu dau seama nici un raționament valid.

EDITAȚI | ×:

Poate că trebuie să fie mai clare.

Luați în considerare transplant(node x, node y)procedura: înlocuiți - x cu y (și subarborele acestuia). Deci, dacă vreau să șterg un nod ( să zicem x) , care are doi copii i - l înlocuiască cu nodul care deține cheia minim în subarborele sau dreapta:

y = minimum(x.right)
transplant(y, y.right) // extracts the minimum (it doesn't have left child)
y.right = x.right
y.left = x.left
transplant(x,y)

Întrebarea era cum să dovedească procedura de mai sus nu este comutativ.

Întrebat 07/06/2010 la 15:46
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
17

Eliminarea (în general) nu este comutativ. Aici este un contraexemplu:

    4
   / \
  3   7
     /
    6

Ce dacă ștergem 4 și apoi 3?

Când ștergem 4, obținem 6 ca noua rădăcină:

   6
  / \
 3   7

Ștergerea 3 nu se schimba copacul, dar ne dă acest lucru:

  6
   \
    7

Ce dacă ștergem 3 și apoi 4?

Când ștergem 3 copac nu se schimbă:

 4
  \
   7
  /
 6

Cu toate acestea, atunci când vom șterge acum 4, noua rădăcină devine 7:

  7
 /
6

Cei doi pomi care rezultă nu sunt identice, prin urmare, ștergerea nu este comutativ.

ACTUALIZAȚI

Nu am citit restricția că acest lucru este atunci când ștergeți întotdeauna un nod cu 2 copii. Soluția mea este pentru cazul general. Voi actualiza dacă / atunci când pot găsi un contra-exemplu.

UN ALT UPDATE

Nu am dovezi concrete, dar am de gând să ghicesc:

În cazul general, se ocupe de ștergeri diferit, în funcție de faptul dacă aveți doi copii, un copil sau fără copii. În contra-exemplu am furnizat, pot șterge mai întâi un nod cu doi copii și apoi un nod cu un singur copil. După aceea, am șterge un nod fără copii și apoi un alt nod cu un singur copil.

În cazul special de numai ștergerea nodurilor cu doi copii, pe care doriți să ia în considerare cazul în care ambele sunt noduri în același sub-copac (din moment ce nu ar conta dacă acestea sunt în diferite sub-copaci, puteți fi siguri că structura generală nu se va schimba în funcție de ordinea de ștergere). Ceea ce într-adevăr nevoie pentru a dovedi este dacă ordinea de ștergere a nodurilor în același sub-copac, în cazul în care fiecare nod are doi copii, probleme.

Luați în considerare două noduri A și B, în cazul în care A este un strămoș al lui B. Apoi, puteți rafina în continuare întrebarea să fie:

Este ștergerea comutativ atunci când au în vedere eliminarea a două noduri dintr-un binar de căutare copac, care au o relație de-strămoș descendent unul de altul (acest lucru ar însemna că acestea sunt în același sub-copac)?

Când ștergeți un nod (să zicem A), ai traversa sub-arborele din dreapta pentru a găsi elementul minim. Acest nod va fi un nod frunză și niciodată nu poate fi egal cu B (deoarece B are doi copii și nu poate fi un nod frunză). Tu ar înlocui atunci valoarea lui A cu valoarea acestei frunze-nod. Aceasta înseamnă că singura modificare structurală a arborelui este înlocuirea valorii lui A cu valoarea frunzei-nod, și pierderea de frunze-nod.

Același proces este implicat pentru B. Aceasta este, înlocuiți valoarea nodului și înlocuiți-o frunză nod. Deci , în general, atunci când ștergeți un nod cu doi copii, singura modificare structurală este modificarea valorii nodului pe care o ștergeți, iar ștergerea nodului de frunze , care este valoarea pe care îl utilizați ca înlocuitor .

Deci, întrebarea este în continuare rafinat:

Puteți garanta că veți obține întotdeauna același nod de înlocuire, indiferent de ordinea de ștergere (atunci când sunt întotdeauna ștergerea unui nod cu doi copii)?

Răspunsul (cred) este da. De ce? Iată câteva observații:

  • Să presupunem că ștergeți nodul descendent primul și al doilea nod strămoș. Sub-copac , care a fost modificat atunci când ați șters nodul descendent este nu în sub-arborele din stânga al copilului dreapta nodului strămoșul lui. Acest lucru înseamnă că această sub-copac rămâne neafectată. Acest lucru înseamnă , de asemenea , este indiferent de ordinea de ștergere, două diferite sub-arbori sunt modificate și , prin urmare , operațiunea este comutativă.
  • Din nou, să presupunem că ștergeți nodul descendent primul și al doilea nod strămoș. Sub-copac , care a fost modificat atunci când ați șters nodul descendent este în sub-arborele stânga al copilului dreapta nodului strămoșul lui. Dar chiar și aici, nu există nici o suprapunere. Motivul este atunci când ștergeți nodul descendent în primul rând, te uiți la sub-arborele din stânga al nodului descendent lui dreapta copilului. Când apoi ștergeți nodul strămoș, vei nu merge în jos , care sub-copac deoarece veți întotdeauna merge spre stânga , după ce introduceți sub-tree stânga-dreapta copil nodul strămoșul lui lui. Deci , din nou, indiferent de ceea ce ștergeți mai întâi pe care o modificați diferite sub-arbori și astfel încât să apară ordinea nu contează.
  • Un alt caz este dacă ștergeți nodul strămoș primul și veți găsi că nodul minim este un copil al nodului descendent. Aceasta înseamnă că nodul descendent se va termina cu un singur copil, și ștergerea un copil este banală. Acum , ia în considerare cazul în care , în acest scenariu, ați șters nodul descendent primul. Apoi , v - ar înlocui valoarea nodului descendent cu copilul său drept și apoi ștergeți copilul din dreapta. Atunci când ștergeți nodul strămoș, va ajunge găsi același nod minim (copilul stânga vechi nod șters, care este , de asemenea , copilul stânga nodului înlocuit lui). Oricum, va termina cu aceeași structură.

Aceasta nu este o dovadă riguroasă; acestea sunt doar câteva observații am făcut. Prin toate mijloacele, nu ezitați să faceți găuri!

Publicat 07/06/2010 la 18:32
sursa de către utilizator

voturi
0

Raspund aici pentru a doua actualizare a Vivin lui.

Cred că acest lucru este o reformare bună a întrebării:

Este ștergerea comutativ atunci când au în vedere eliminarea a două noduri dintr-un binar de căutare copac, care au o relație de-strămoș descendent unul de altul (acest lucru ar însemna că acestea sunt în același sub-copac)?

dar această teză îndrăzneață de mai jos nu este adevărat:

Când ștergeți un nod (să zicem A), ai traversa sub-arborele din dreapta pentru a găsi elementul minim. Acest nod va fi un nod frunză și niciodată nu poate fi egal cu B

întrucât elementul minim din dreapta lui subarborelui poate avea un copil drept . Deci, nu este o frunză. Să numim elementul minim lui subarborelui drept successor(A). Acum, este adevărat că B nu poate fi successor(A), dar poate fi în subarborele sau dreapta. Deci, este o mizerie.

Eu încerc să rezum.

ipoteză :

  1. A și B au doi copii fiecare.
  2. A și B sunt în același subramificație.

Alte lucruri putem deduce din ipoteze:

  1. B nu este successor(A), nici este successor(B).

Acum, având în vedere că, cred că există 4 cazuri diferite (ca de obicei, să fie un strămoș al lui B):

  1. B este în stânga lui subarborelui
  2. B este strămoșul successor(A)
  3. successor(A) este un strămoș al B
  4. B și succesorul (A) nu au nici o relație. (Acestea sunt în diferite subarbori lui A)

Cred că (dar, desigur , nu pot dovedi) că cazurile 1, 2 și 4 nu contează. Deci, numai în cazul successor(A)este un strămoș al procedurii de ștergere B nu a putut fi comutative. Sau ar putea?

Am trece mingea:)

Salutari.

Publicat 11/06/2010 la 18:45
sursa de către utilizator

voturi
2

Mi se pare că contraexemplul arătat în răspunsul Vivin este singurul caz de non-comutativitate, și că aceasta este într-adevăr eliminată prin restricția ca nodurile numai cu doi copii pot fi șterse.

Dar poate fi, de asemenea, eliminate dacă vom renunța la ceea ce pare a fi una dintre sediile Vivin, care este că ar trebui să traverseze subarborelui drept cât mai puțin posibil pentru a găsi orice succesor acceptabil. Dacă, în schimb, vom promova întotdeauna cel mai mic nodul din subarborelui drept ca succesor, indiferent de cât de departe se dovedește a fi localizat, atunci chiar dacă se relaxeze restricțiile privind ștergerea nodurilor cu mai mult de doi copii, rezultatul Vivin lui

    7
   /
  6
nu este niciodată atinsă dacă începem de la

    4
   / \
  3 7
     /
    6

In schimb, vom șterge mai întâi 3 (fără succesor) și apoi ștergeți 4 (cu 6 ca succesor), obținându-se

    6
     \
      7

care este aceeași ca și în cazul în care ordinea de ștergere au fost inversate.

Eliminarea ar fi atunci comutativă, și cred că este întotdeauna comutativ, având în vedere premisa am numit (succesorul este întotdeauna cel mai mic nod din subarborele drept al nodului eliminat).

Nu am o dovadă formală de a oferi, doar o enumerare a cazurilor:

  1. Dacă cele două noduri care urmează să fie eliminate sunt în diferite subarbori, atunci ștergerea unuia nu afectează cealaltă. Numai atunci când acestea sunt în aceeași cale poate ordinea de ștergere afectează, eventual, rezultatul.

    Deci, orice efect asupra comutativitatea poate veni doar atunci când un nod strămoș și unul dintre descendenții săi sunt ambele șterse. Acum, cum relația lor verticală afectează comutativitatea?

  2. Descendentul în subarborele stâng al strămoș. Această situație nu va afecta comutativitatea , deoarece succesorul vine de la subarborelui drept și nu poate afecta subarborele stâng , la toate.

  3. Descendentul în subarborele drept al strămoș. Dacă succesorul strămoș este întotdeauna cel mai mic nodul din subarborelui drept, atunci ordinea de ștergere nu pot schimba alegerea succesorului, indiferent de ce descendent este șters înainte sau după strămoș. Chiar dacă succesorul strămoșul se dovedește a fi nodul descendent , care este , de asemenea , să fie eliminată, ca descendent prea se înlocuiește cu următorul cel mai mare nod la ea, și că descendent nu poate avea propria sa subarbore stânga rămas să fie tratate . Deci , eliminarea unui strămoș și orice descendent din dreapta-subramificație va fi întotdeauna comutative.

Publicat 06/04/2011 la 19:34
sursa de către utilizator

voturi
0

Cred că există două moduri la fel de viabile pentru a șterge un nod, atunci când acesta are 2 copii:
TRECI LA CASE 4 ...

Cazul 1: ștergeți 3 (nod frunze)
 2 3
 / \ -> / \
1 3 1


Cazul 2: ștergeți 2 (nodul copil stânga)
 2 3
 / \ -> / \
1 3 1


Cazul 3: ștergeți 2 (nodul copil dreapta)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
Cazul 4: ștergeți 2 (stânga și dreapta) noduri copil
 2 2 3
 / \ -> / \ sau / \      
1 3 1 3
și lucru au diferite copaci rezultate :) ______________________________________________________________________
Așa cum algoritm explicat aici: http: // www .mathcs.emory.edu / ~ / Cursuri cheung / 323 / Analitice / Copaci / AVL-delete.html Deleting a node with 2 children nodes: 1) Replace the (to-delete) node with its in-order predecessor or in-order successor 2) Then delete the in-order predecessor or in-order successor

Publicat 10/10/2016 la 01:02
sursa de către utilizator

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