logo

Radering

Raderingsfunktionen används för att ta bort den angivna noden från ett binärt sökträd. Vi måste dock ta bort en nod från ett binärt sökträd på ett sådant sätt att egenskapen för binärt sökträd inte bryter mot. Det finns tre situationer för att ta bort en nod från binärt sökträd.

Noden som ska raderas är en lövnod

Det är det enklaste fallet, i det här fallet, byt ut lövnoden med NULL och frigör enkelt det tilldelade utrymmet.

numrera alfabetet

I följande bild tar vi bort noden 85, eftersom noden är en lövnod, därför kommer noden att ersättas med NULL och tilldelat utrymme kommer att frigöras.


Borttagning i binärt sökträd

Noden som ska raderas har bara ett barn.

Ersätt i så fall noden med dess underordnade och ta bort den underordnade noden, som nu innehåller värdet som ska tas bort. Byt bara ut det med NULL och frigör det tilldelade utrymmet.

I följande bild ska noden 12 raderas. Den har bara ett barn. Noden kommer att ersättas med sin undernod och den ersatta noden 12 (som nu är lövnod) kommer helt enkelt att raderas.


Borttagning i binärt sökträd

Noden som ska raderas har två barn.

Det är ett lite komplext fall jämfört med andra två fall. Emellertid ersätts noden som ska raderas med dess efterföljare eller föregångare i ordningsföljd rekursivt tills nodvärdet (som ska raderas) placeras på trädets blad. Efter proceduren, ersätt noden med NULL och frigör det tilldelade utrymmet.

I följande bild ska noden 50 tas bort, vilken är trädets rotnod. Traverseringen av trädet i ordning som anges nedan.

6, 25, 30, 50, 52, 60, 70, 75.

slumpmässig värdegenerator i java

ersätt 50 med dess efterföljare 52 i sin ordning. Nu kommer 50 att flyttas till trädets blad, som helt enkelt kommer att raderas.


Borttagning i binärt sökträd

Algoritm

Ta bort (TRÄD, ITEM)

    Steg 1:OM TRÄD = NULL
    Skriv 'objektet hittades inte i trädet' ANNARS OM ARTIKELDATA
    Ta bort (TRÄD->VÄNSTER, FÖREMÅL)
    ANNAT OM ARTIKEL > TRÄD -> DATA
    Ta bort (TRÄD -> HÖGER, ITEM)
    ANNAT OM TRÄD -> VÄNSTER OCH TRÄD -> HÖGER
    SET TEMP = findLargestNode(TRÄD -> VÄNSTER)
    STÄLL IN TRÄD -> DATA = TEMP -> DATA
    Ta bort(TRÄD -> VÄNSTER, TEMP -> DATA)
    ANNAN
    SET TEMP = TRÄD
    OM TRÄD -> VÄNSTER = NULL OCH TRÄD -> HÖGER = NULL
    SET TREE = NULL
    ANNAT OM TRÄD -> VÄNSTER != NULL
    SÄTT TRÄD = TRÄD -> VÄNSTER
    ANNAN
    SÄTT TRÄD = TRÄD -> HÖGER
    [SLUT PÅ OM]
    FRI TEMP
    [SLUT PÅ OM]Steg 2:SLUTET

Fungera:

 void deletion(Node*& root, int item) { Node* parent = NULL; Node* cur = root; search(cur, item, parent); if (cur == NULL) return; if (cur->left == NULL && cur->right == NULL) { if (cur != root) { if (parent->left == cur) parent->left = NULL; else parent->right = NULL; } else root = NULL; free(cur); } else if (cur->left && cur->right) { Node* succ = findMinimum(cur- >right); int val = succ->data; deletion(root, succ->data); cur->data = val; } else { Node* child = (cur->left)? Cur- >left: cur->right; if (cur != root) { if (cur == parent->left) parent->left = child; else parent->right = child; } else root = child; free(cur); } } Node* findMinimum(Node* cur) { while(cur->left != NULL) { cur = cur->left; } return cur; }