Schrapping procedure voor een binaire zoekboom

stemmen
7

Denk aan het verwijderen procedure op een BST, wanneer het knooppunt wilt verwijderen heeft twee kinderen. Laten we zeggen dat ik altijd te vervangen door de node die de minimum sleutel in zijn rechter deelboom.

De vraag is: is deze procedure commutatief? D.w.z. verwijderen x en y heeft hetzelfde resultaat dan eerst verwijderen y en x?

Ik denk dat het antwoord is nee, maar ik kan een tegenvoorbeeld niet vinden, noch erachter te komen elke geldige redenering.

BEWERK:

Misschien heb ik moet duidelijker zijn.

Denk aan de transplant(node x, node y)procedure: het is x te vervangen door y (en zijn subtree). Dus, als ik wil een knooppunt te verwijderen (bijvoorbeeld x), die twee kinderen heeft i vervangen door de node die de minimum sleutel in zijn rechter deelboom:

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)

De vraag was hoe om te bewijzen dat de bovenstaande procedure is niet verwisselbaar.

De vraag is gesteld op 07/06/2010 om 15:46
bron van user
In andere talen...                            


4 antwoorden

stemmen
17

Deletie (in het algemeen) is niet verwisselbaar. Hier is een tegenvoorbeeld:

    4
   / \
  3   7
     /
    6

Wat als we verwijderen 4 en vervolgens 3?

Als we verwijderen 4, krijgen we 6 als de nieuwe root:

   6
  / \
 3   7

Het verwijderen van 3 niet de boom te veranderen, maar geeft ons dit:

  6
   \
    7

Wat als we verwijderen 3 en 4?

Als we verwijderen 3 de boom niet verandert:

 4
  \
   7
  /
 6

Echter, wanneer we nu verwijderen 4, de nieuwe wortel wordt 7:

  7
 /
6

De twee resulterende bomen zijn niet hetzelfde, dus verwijdering niet commutatief.

BIJWERKEN

Ik heb gelezen niet de beperking dat dit is wanneer je altijd een knooppunt te verwijderen met 2 kinderen. Mijn oplossing is voor het algemene geval. Ik zal het updaten als / wanneer ik kan een tegenvoorbeeld vinden.

Weer een update

Ik heb geen concreet bewijs, maar ik ga een gok te wagen:

In het algemene geval, het handvat je verwijderingen anders, afhankelijk van of u hebben twee kinderen, een kind, of geen kinderen. In de tegenvoorbeeld I ontvangen, ik eerst een knooppunt twee kinderen en een knooppunt met een kind verwijderen. Daarna heb ik een knoop zonder kinderen en vervolgens een ander knooppunt met een kind te verwijderen.

In het speciale geval van alleen te verwijderen nodes met twee kinderen, je wilt het geval dat beide knooppunten in dezelfde sub-boom (omdat het niet van belang zou zijn als ze in verschillende sub-bomen te overwegen, je kunt er zeker van zijn dat de opzet niet veranderen in de volgorde van deletie). Wat je echt nodig hebt om te bewijzen is of de volgorde van de schrapping van knooppunten in dezelfde sub-boom, waarbij elke knoop heeft twee kinderen, zaken.

Beschouw twee knooppunten A en B, waarbij A een voorouder van B. Dan kunt u verder verfijnen van de vraag te zijn:

Is verwijdering commutatieve wanneer u overweegt het schrappen van twee knooppunten van een binaire zoekboom die een voorouder-afstammeling relatie met elkaar te maken hebben (dit zou betekenen dat ze in dezelfde sub-boom)?

Wanneer u een knooppunt verwijderen (laten we zeggen A), de juiste sub-boom doorkruisen tot het minimum element te vinden. Dit knooppunt zal een blad knooppunt en kan nooit gelijk zijn aan B zijn (omdat B heeft twee kinderen en kan niet een blad node). Je zou dan in de plaats van de waarde van A met de waarde van deze leaf-knooppunt. Wat dit betekent is dat de enige structurele wijziging van de boom is de vervanging van A's waarde met de waarde van het blad-knooppunt, en het verlies van het blad-knooppunt.

Hetzelfde proces is betrokken voor B. Dat wil zeggen dat u de waarde van het knooppunt te vervangen en vervangen van een leaf-knooppunt. Dus in het algemeen, als je een knooppunt met twee kinderen te verwijderen, de enige structurele verandering is de verandering in de waarde van het knooppunt u verwijdert, en het schrappen van het blad knooppunt wiens waarde die u gebruikt als vervanging .

Dus de vraag is verder verfijnd:

Kunt u garanderen dat u altijd krijgt hetzelfde vervanging knooppunt ongeacht de volgorde van de verwijdering (als je altijd het verwijderen van een knooppunt met twee kinderen)?

Het antwoord (denk ik) is ja. Waarom? Hier zijn een paar opmerkingen:

  • Laten we zeggen dat je de afstammeling knooppunt eerste en de voorloper knooppunt tweede verwijderen. De sub-boom die is gewijzigd wanneer u de afstammeling knooppunt verwijderd is niet in de linker sub-boom van het recht van het kind van de voorouder node. Dit betekent dat deze sub-boom blijft onaangetast. Dit betekent ook ongeacht de volgorde van deletie, twee verschillende sub-bomen gemodificeerd en daardoor de werking commutatief.
  • Nogmaals, laten we zeggen dat je de afstammeling knooppunt eerste en de voorloper knooppunt tweede verwijderen. De sub-boom die is gewijzigd wanneer u de afstammeling knooppunt verwijderd is in de linker sub-boom van het recht van het kind van de voorouder node. Maar ook hier is er geen overlap. De reden hiervoor is wanneer je de afstammeling knooppunt eerste verwijderen, je kijkt naar de linker sub-boom van de afstammeling knooppunt recht kind. Als je dan de voorouder knooppunt verwijderen, zul je nooit meer gaan dat sub-boom omdat je altijd gaan naar links na het linker sub-boom de voorouder knooppunt rechts-kind in te voeren. Dus nogmaals, ongeacht wat je voor het eerst verwijdert u wijzigt verschillende sub-bomen en zo lijkt volgorde maakt niet uit.
  • Een ander geval is als je de voorouder knooppunt eerste verwijderen en u vindt dat de minimum-knooppunt is een kind van de afstammeling knooppunt. Dit betekent dat de nakomeling knooppunt zal eindigen met een kind, en verwijderen van een kind triviaal. Beschouw nu het geval dat in dit scenario, u hebt verwijderd de afstammeling knooppunt eerste. Dan zou je de waarde van de afstammeling knooppunt vervangen door haar recht kind en verwijder vervolgens de juiste kind. Dan wanneer u de voorvader knooppunt verwijderen, je uiteindelijk het vinden van de dezelfde minimum knooppunt (linker kind van de oude verwijderde knooppunt, die ook links kind het vervangen node). Hoe dan ook, je eindigt met dezelfde structuur.

Dit is niet een rigoureuze bewijs; dit zijn slechts enkele opmerkingen die ik heb gemaakt. Door alle middelen, voel je vrij om gaten te porren!

antwoordde op 07/06/2010 om 18:32
bron van user

stemmen
0

Ik reageer hier om tweede bijwerking Vivin's.

Ik denk dat dit een goede herschikking van de vraag:

Is verwijdering commutatieve wanneer u overweegt het schrappen van twee knooppunten van een binaire zoekboom die een voorouder-afstammeling relatie met elkaar te maken hebben (dit zou betekenen dat ze in dezelfde sub-boom)?

maar dit vetgedrukte zin hieronder is niet waar:

Wanneer u een knooppunt verwijderen (laten we zeggen A), de juiste sub-boom doorkruisen tot het minimum element te vinden. Dit knooppunt zal een blad node en kan nooit gelijk is aan B zijn

omdat de minimale element in A's rechter deelboom kan een recht kind te hebben . Dus, het is niet een blad. Laten we noemen het minimale element in A's rechter deelboom successor(A). Nu, het is waar dat B niet kan worden successor(A), maar het kan in zijn rechter deelboom. Dus, het is een puinhoop.

Ik probeer te vatten.

hypothese :

  1. A en B hebben twee kinderen per stuk.
  2. A en B in dezelfde substructuur.

Andere dingen die we kunnen afleiden uit hypothese:

  1. B is successor(A)noch A is successor(B).

Nu, gezien het feit dat, ik denk dat er zijn 4 verschillende gevallen (zoals gewoonlijk, laat een een voorouder van B):

  1. B is in linker deelboom A's
  2. B is een voorouder van successor(A)
  3. successor(A) is een voorouder van B
  4. B en opvolger (A) geen relatie hebben. (Ze zijn in verschillende substructuren A's)

Ik denk (maar natuurlijk ik kan het niet bewijzen) dat de gevallen 1, 2 en 4 doen er niet toe. Dus, alleen in het geval successor(A)is een voorouder van B verwijdering procedure kon niet verwisselbaar zijn. Of zou het?

Ik passeer de bal:)

Vriendelijke groeten.

antwoordde op 11/06/2010 om 18:45
bron van user

stemmen
2

Het lijkt mij dat de in antwoord Vivin's tegenvoorbeeld is de enige niet-commutativiteit, en dat het zelfs opgeheven, door de beperking dat slechts knooppunten met twee kinderen kan worden verwijderd.

Maar het kan ook worden geëlimineerd als we negeren wat lijkt op een van de lokalen Vivin's, namelijk dat we de rechter deelboom zo weinig mogelijk moeten doorkruisen om de aanvaardbare opvolger te vinden. Als, in plaats daarvan, bevorderen we altijd de kleinste knooppunt in de rechter deelboom als opvolger, ongeacht hoe ver het blijkt te bevinden, dan is zelfs als we ontspannen de beperking van het verwijderen van knooppunten met minder dan twee kinderen, resultaat Vivin's

    7
   /
  6
is nooit bereikt als we beginnen bij

    4
   / \
  3 7
     /
    6

In plaats daarvan zouden we eerst te verwijderen 3 (zonder opvolger) en verwijder vervolgens 4 (met 6 als opvolger), waardoor

    6
     \
      7

die dezelfde is als de volgorde van verwijdering teruggenomen.

Schrapping zou dan commutatief zijn, en ik denk dat het altijd commutatief, gezien het uitgangspunt heb ik de naam (opvolger is altijd kleinste knooppunt in rechter deelboom van verwijderde knooppunt).

Ik heb geen formeel bewijs te bieden, slechts een opsomming van gevallen:

  1. Als de twee knooppunten te wissen in verschillende substructuren, dan deletie van een niet meer beïnvloeden. Alleen wanneer zij in hetzelfde pad kan de volgorde van deletie mogelijk invloed op de uitkomst.

    Dus geen enkel effect op commutativiteit kan alleen komen wanneer een voorouder knooppunt en één van zijn nakomelingen beide worden verwijderd. Nu, hoe hun verticale relatie beïnvloeden commutativiteit?

  2. Afstammeling in de linker deelboom van de voorouder. Deze situatie heeft geen invloed op commutativiteit omdat de opvolger komt van de rechter deelboom en kan geen invloed op de linker deelboom at all.

  3. Afstammeling in de rechter deelboom van de voorouder. Als opvolger van de voorouder is altijd de kleinste knooppunt in de rechter deelboom, dan orde van verwijdering kan niet de keuze van de opvolger te veranderen, ongeacht wat afstammeling wordt verwijderd voor of na de voorouder. Zelfs als de opvolger van de voorouder blijkt de afstammeling knooppunt dat ook moet worden verwijderd zijn, kan dat afstammeling te vervangen door het de op een na grootste knooppunt aan, en dat afstammeling geen eigen linker deelboom die nog moeten worden aangepakt . Dus verwijderen van een voorouder en een recht-subtree nakomeling zal altijd commutatief zijn.

antwoordde op 06/04/2011 om 19:34
bron van user

stemmen
0

Ik denk dat er twee even haalbare manieren om een knooppunt te verwijderen, wanneer het heeft 2 kinderen:
doorgaan naar CASE 4 ...

Case 1: schrappen 3 (Leaf knooppunt)
 2 3
 / \ -> / \
1 3 1


Case 2: schrappen 2 (links kindnode)
 2 3
 / \ -> / \
1 3 1


Case 3: schrappen 2 (Rechts kind knooppunt)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
Zaak 4: schrappen 2 (Left & Right kind nodes)
 2 2 3
 / \ -> / \ of / \      
1 3 1 3
Beiden werken en hebben verschillende resulterende bomen :) ______________________________________________________________________
Zoals algoritme hier uitgelegd: http: // www .mathcs.emory.edu / ~ cheung / cursussen / 323 / Syllabus / Trees / 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

antwoordde op 10/10/2016 om 01:02
bron van user

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