İkili Arama Ağacı (Binary Search Tree)
Yazan : Şadi Evren ŞEKER
İkili ağaçların (Binary Tree) özel bir hali olan ikili arama ağaçlarında, düğümlerde duran bilgilerin birbirine göre küçüklük büyüklük ilişkisi bulunmalıdır. Örneğin tam sayılardan(integer) oluşan veriler tutulacaksa bu verilerin aralarında küçük-büyük ilişkisi bulunmaktadır.
İkili arama ağacı, her düğümün solundaki koldan ulaşılabilecek bütün verilerin düğümün değerinden küçük, sağ kolundan ulaşılabilecek verilerin değerinin o düğümün değerinden büyük olmasını şart koşar.
Örneğin yukarıda bir ikili arama ağacı tasvir edilmiştir. Bu ağaçta dikkat edilecek olursa kökün solunda bulunan bütün sayılar kökten küçük ve sağında bulunan bütün sayılar kökten büyüktür.
İkili arama ağacına bu kurala uygun olarak ekleme çıkarma veya silme işlemleri yapılabilir. Ancak yapılan her işlemden sonra ikili arama ağacının yapısı bozulmamış olmalıdır.
İkili arama ağacında arama işlemi:
Yukarıda da anlatıldığı üzere ağacın üzerinde duran verilerin özel bir şekilde sıralı bulunması gerekir. Buna göre herhangi bir değeri arayan kişi ağacın kök değerine bakarak aşağıdaki 3 eylemden birisini yapar:
- Aranan sayı kökteki değere eşittir -> Aranan değer bulunmuştur
- Aranan sayı kökteki değerden küçüktür -> Kökün sol kolu takip edilir
- Aranan sayı kökteki deüerden büyüktür -> Kökün sağ kolu takip edilir
İkili arama ağaçlarının önemli bir özelliği ise öz çağıran(recursive) oluşudur. Buna göre bir ağacın sol kolu veya sağ kolu da birer ağaçtır. Bu özellikten faydalanarak örneğin C dilinde aşağıdaki şekilde bir arama fonksiyonu yazılabilir:
dugum * ara(dugum *kok, int deger){
if(deger == kok->veri){
return kok;
}
else if(deger > kok->veri ){
return ara(kok->sag, deger);
}
else{
return ara(kok->sol,deger);
}
}
Yukarıdaki bu örnekte daha önce ikili ağaçlar konusunda tanımlanmış bir düğüm struct’ı kullanılmıştır. Koda dikkat edilecek olursa özçağıran bir yapı görülebilir. Yani fonksiyonun içerisinde kendisi çağrılmış ve yeni kök değeri olarak mevcut kökün sol veya sağ değeri verilmiştir. Arana değer her durumda değişmediği için alt düğümlere kadar aynı olarak indirilmiştir.
Yukarıdaki koddaki önemli bir eksiklik ise kodun ağaç üzerinde bir sayıyı bulamaması durumunun tasarlanmamış olmasıdır. Bu durumda basitçe NULL değer kontrolü ile aşılabilir. Buna göre sol veya sağa gitmeden önce sol veya sağda bir değer olduğuna bakılmalı şayet değer varsa gidilmelidir. Şayet değer yoksa ağaçta bu sayının bulunma ihtimali yoktur ve bu sayının olmadığını belirten bir ifade (örneğin NULL) döndürülmelidir. Kodun bu şekilde tashih edilmiş hali aşağıda verilmiştir:
dugum * ara(dugum *kok, int deger){
if(deger == kok->veri){
return kok;
}
else if(deger > kok->veri ){
if(kok->sag != NULL)
return ara(kok->sag, deger);
else
return NULL;
}
else{
if(kok->sag != NULL)
return ara(kok->sol,deger);
else
return NULL
}
}
« İkili Ağaç (Binary Tree) | TML (Time Markup Language, Zaman İşaretleme Dili, ZİD) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'İkili Arama Ağacı (Binary Search Tree)' isimli yazı 07 May 2008 tarihinde, saat: 05:35 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 3176 defa okunmuştur.
Benzer yazıları Bilgisayar Kavramları, veri yapıları kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Sıralama işleminiz poligonu...
- Şadi Evren ŞEKER: bahsettiğiniz sıralama algoritması...
- Abdurrahman ulusoy: merhaba hocam. gelişigüzel...
- Oguz Okutan: Merhaba hocam.. Fonksiyonlarda degere göre...
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
Yakın Yazılar
Arama Algoritmaları (Search Algorithms)
Binary Search Tree’yi Inorder olarak dolaşan Kod
İkili Arama Ağacı (Binary Search Tree)
Derin Öncelikli Arama (Depth First Search , DFS)
Sığ Öncelikli Arama (Breadth First Search , BFS)
Internal Path Reduction Trees ( İç Yol İndirgeme Ağaçları)
Fibonacci Arama Algoritması (Fibonacci Search Algorithm)
Doğrusal Arama (Linear Search)
Sürahi Problemi (Water Jug Problem)
Sınırlı Derin Öncelikli Arama (Depth-Limited Search)
Ara Değer Araması (Interpolation Search)
Kırmızı-Siyah Ağaçları (Red Black Trees)
Knuth Morris Prat Algoritması (KMP Algorithm)
Kaba Kuvvet Metin Arama Algoritması (Bruteforce Text Search Algorithm)
Bağlantılar

[...] İkili arama ağaçları (Binary Search Tree) [...]
[...] ağaçlarının (trie), ikili arama ağaçlarına göre en önemli avantajları bir metni aramanın, metin boyutu kadar işlem gerektirmesidir. [...]
[...] Ağaçları sürekli olarak dengeli olan ikili arama ağaçlarındandır. G.M. Adelson-Velsky ve E.M. Landis tarafından geliştirilmiş olan bu ağaç algoritmasının [...]
[...] bir parçala fethet (divide and conquere) yaklaşımıdır. Benzer bir arama yöntemi olan ikili arama (binary search) ile aynı algoritma karmaşıklığına sahiptir O(log n) ancak yapılan matematiksel [...]