Binary search tree de silme işlemi başka yapılarda oldugu gibi biraz karmaşıktır.
Silme işlemi için adımlarımız
Öncelikle silinecek elemanın adresini buluruz. Sonra 4 durum karşımıza çıkar
1‐Hiçbir çocuk olmama durumu
2‐Sadece sağ çocuğu olma durumu
3‐Sadece sol çocuğu olma durumu
4‐Her iki çocuğu olma durumu
1‐Hiçbir çocuk olmama durumu
Bu durum oldukça basittir. Algoritma, sileceğimiz eleman yani ebeveyne karşılık gelen sağ ya da solunu NULL olarak ayarlarız ve düğümü çıkarırız.
2‐Sadece sağ çocuğu olma durumu
Bu durumda silinecek sağ çocuğu bir önceki parentı yani ebeveynin sağına bağlarız.
3‐Sadece sol çocuğu olma durumu
Bu durumda silinecek sol çocuğu bir önceki parentı ebeveynin soluna bağlarız.
4‐Her iki çocuğu olma durumu
ilk önce silinecek elemanın sağındaki en küçük elemanı bulur,
sonra bulduğumuz en küçük elemanın bir önceki yani ebeveynini buluruz.
Sonra bulduğumuz sağ taraftaki en küçük eleman ile siliceğimiz elemanın yerine koyarız.
Sonra en küçük elemanı parent nesnesi ile sağdaysa sağ tarafı null yapar yoksa sol taraftaysa solunu null yapar sağdaki en küçük değeri kaldırmış oluruz. Böylece yapıyı bozmadan güzel bir şekilde sileceğimiz elemanı yerleriniz değiştirerek silmiş oluruz.
Binary Search Tree Recursive Kodları
void remove(int in) { Node rm = search(in); Node pr = searchParent(in, rm); if (pr == null) return; else { if ((rm.left == null) && (rm.right == null)) {//hiç cocugu olmayan if (pr.left == rm) pr.left = null; else pr.right = null; } else if ((rm.left == null) && (rm.right != null)) {//sadece sağ çocugu olan pr.right= rm.right; } else if ((rm.left != null) && (rm.right == null)) {//sadece sol çocugu olan pr.left = rm.left; } else {//iki çocugu olan.. int a = rm.right.searchMin().id; Node nd = searchParent(a, rm.right.searchMin()); rm.id = a; if (nd.left.id == a) nd.left = null; else nd.right = null; } } }
Okuyup geçme yorum yap lütfen :)
Yorumunuz cevaplandığında bildirim almak için Beni bilgilendir'i işaretleyin.
EmojiEmoji