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.
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.
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.
Algoritm
Ta bort (TRÄD, ITEM)
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]
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; }