Algoritmalar İkili Arama Ağaçları Bahar 2016 Doç. Dr. Suat Özdemir 1
İkili Arama Ağaçları Binary Search Tree (BST) İkili arama ağaçları dinamik veri işlemlerini gerçekleştiren veri yapılarıdır Search, Minimum, Maximum, Predecessor, Successor, Insert, Delete Sözlükler, önceliklendirilmiş kuyruklar BST ile gerçekleştirilebilir Temel işlemler ağaç yüksekliği ile orantılı bir zamanda tamamlanabilir O(h) En kötü durum O(n) 56 26 200 18 28 190 213 12 24 27 Bahar 2016 Doç. Dr. Suat Özdemir 2
İkili Arama Ağaçları - Gösterim Düğümlerden oluşan bağlı bir veri yapısı olarak gösterilebilir root(t) ağacın kökünü gösterir Her düğüm aşağıdaki alanlara sahiptir key left sol çocuğu gösteren pointer right sağçocuğu gösteren pointer p parenti gösteren pointer. p[root[t]] = NIL Bahar 2016 Doç. Dr. Suat Özdemir 3
İkili Arama Ağaçları BST Özelliği Ağaçta bulunan tüm düğümler aşağıda tanımlanmış olan BST özelliğini sağlamak zorundadırlar y in left subtree of x, then key[y] key[x]. y in right subtree of x, then key[y] key[x]. 56 26 200 18 28 190 213 12 24 27 Bahar 2016 Doç. Dr. Suat Özdemir 4
İkili Arama Ağaçları Sıralı yürüme BST özelliği sayesinde ağaç üzerindeki tüm düğümler sıralı olarak yazdırılabilir (küçükten büyüğe). Sıralı yürüme - In order tree walk Çalışma zamanı O(n) Inorder-Tree-Walk (x) 1. if x NIL 2. then Inorder-Tree-Walk(left[p]) 3. print key[x] 4. Inorder-Tree-Walk(right[p]) 56 26 200 18 28 190 213 12 24 27 Bahar 2016 Doç. Dr. Suat Özdemir 5
İkili Arama Ağaçları Arama Tree-Search(x, k) 1. if x = NIL or k = key[x] 2. then return x 3. if k < key[x] 4. then return Tree-Search(left[x], k) 5. else return Tree-Search(right[x], k) Bahar 2016 Doç. Dr. Suat Özdemir 6
İkili Arama Ağaçları Arama Iterative-Tree-Search(x, k) 1. while x NIL and k key[x] 2. do if k < key[x] 3. then x left[x] 4. else x right[x] 5. return x Artımlı arama çoğu bilgisayarda çok daha hızlı çalışır Bahar 2016 Doç. Dr. Suat Özdemir 7
İkili Arama Ağaçları Max/Min BST özelliğine göre Minimum en sol çocukta Maximum en sağ çocukta yer alır Tree-Minimum(x) Tree-Maximum(x) 1. while left[x] NIL 1. while right[x] NIL 2. do x left[x] 2. do x right[x] 3. return x 3. return x Bahar 2016 Doç. Dr. Suat Özdemir 8
İkili Arama Ağaçları Önceki/Sonraki X in sonraki (successor) düğümü y ağaç içindeki key[y] değeri key[x] den büyük olan en küçük değere sahip düğümdür En büyük değere sahip düğümün sonraki düğümü NIL dir Sonraki düğümü arama işleminde iki durum vardır: Eğer x in bir sağ alt ağacı varsa: Bu durumda sağ alt ağacın en küçük değere sahip düğümü x in sonraki düğümüdür Eğer x in bir sağ alt ağacı yoksa: Ağaçta sola üste doğru çıkarken anahtar değerleri küçülmektedir Çıkabildiğin kadar sol üst ağaçta yukarı çık Çıkamadığın düğümün parenti x in sonraki düğümüdür Bahar 2016 Doç. Dr. Suat Özdemir 9
İkili Arama Ağaçları Önceki/Sonraki Tree-Successor(x) 1. if right[x] NIL 2. then return Tree-Minimum(right[x]) 3. y p[x] 4. while y NIL and x = right[y] 5. do x y 6. y p[y] 7. return y 56 26 200 18 28 190 213 12 24 27 Önceli için işlemler bunun tersidir. Çalışma zamanı O(h) Bahar 2016 Doç. Dr. Suat Özdemir 10
İkili Arama Ağaçları Ekleme BST nin tuttuğu dinamik seti değiştirir Eklenen her değer BST yi korumak zorundadır Ekleme, silmeye göre çok daha kolaydır 56 26 200 18 28 190 213 Tree-Insert(T, z) 1. y NIL 2. x root[t] 3. while x NIL 4. do y x 5. if key[z] < key[x] 6. then x left[x] 7. else x right[x] 8. p[z] y 9. if y = NIL 10. then root[t] z 11. else if key[z] < key[y] 12. then left[y] z 13. else right[y] z 12 24 27 Bahar 2016 Doç. Dr. Suat Özdemir 11
İkili Arama Ağaçları Ekleme Satır 1-2 başlangıç işlemleri O(1) zaman Satır 3-7 deki while döngüsü parent y yi tutarak eklenecek olan z düğümü için yer arar Bu işlem O(h) zaman alır Satır 8-13 ekleme işlemi O(1) zaman Ekleme işlemi toplam O(h) zamanda tamamlanır Tree-Insert(T, z) 1. y NIL 2. x root[t] 3. while x NIL 4. do y x 5. if key[z] < key[x] 6. then x left[x] 7. else x right[x] 8. p[z] y 9. if y = NIL 10. then root[t] z 11. else if key[z] < key[y] 12. then left[y] z 13. else right[y] z Bahar 2016 Doç. Dr. Suat Özdemir 12
İkili Arama Ağaçları Silme Silme işleminde sürekli aşağıdaki üç durum oluşur: if x has no children case 0 then remove x if x has one child case 1 then make p[x] point to child if x has two children (subtrees) case 2 then swap x with its successor perform case 0 or case 1 to delete it Silme işlemi toplam O(h) zamanda tamamlanır Bahar 2016 Doç. Dr. Suat Özdemir 13
Tree-Delete(T, z) /* Determine which node to splice out: either z or z s successor. */ 1. if left[z] = NIL or right[z] = NIL 2. then y z 3. else y Tree-Successor[z] /* Set x to a non-nil child of y, or to NIL if y has no children. */ 4. if left[y] NIL 5. then x left[y] 6. else x right[y] /* y is removed from the tree by manipulating pointers of p[y] and x */ 7. if x NIL 8. then p[x] p[y] /* Continued on next slide */ Bahar 2016 Doç. Dr. Suat Özdemir 14
Tree-Delete(T, z) (Contd. from previous slide) 9. if p[y] = NIL 10. then root[t] x 11. else if y left[p[y]] 12. then left[p[y]] x 13. else right[p[y]] x /* If z s successor was spliced out, copy its data into z */ 14. if y z 15. then key[z] key[y] 16. copy y s satellite data into z. 17. return y Bahar 2016 Doç. Dr. Suat Özdemir 15
İkili Arama Ağaçları Silme (4 silinecek) 6 6 2 8 2 8 1 4 1 4 3 3 Bahar 2016 Doç. Dr. Suat Özdemir 16
İkili Arama Ağaçları Silme (4 silinecek) 6 6 2 8 2 8 1 4 1 3 3 Bahar 2016 Doç. Dr. Suat Özdemir 17
İkili Arama Ağaçları Silme (2 silinecek) 6 6 2 8 2 8 1 5 1 5 3 3 4 4 Bahar 2016 Doç. Dr. Suat Özdemir 18
İkili Arama Ağaçları Silme (2 silinecek) 6 6 2 8 32 8 1 5 1 5 3 4 4 Bahar 2016 Doç. Dr. Suat Özdemir 19