İkili Ağaç (Binary Tree)

Yazan: Şadi Evren ŞEKER

Ağaçların özel bir hali olan ikili ağaçlarda her düğümün çocuklarının sayısı azami 2 olabilir. Bir düğümün daha az çocuğu bulunması durumunda ( 0 veya 1) ağacın yapısı bozulmaz. Yapraklar hariç bütün düğümlerin ikişer çocuğu bulunması ve yaprakların aynı derinlikte bulunması durumunda bu ağaca dengeli ağaç (balanced tree) denilir. Aşağıda bir dengeli ikili ağaç örneği tasvir edilmiştir:

ikiliagac.jpg

Bu ağacı değişik sıralarda yeniden oluşturabiliriz. Örneğin aşağıdaki ağaç da yukarıdaki verilerin aynılarını taşıyan bir ikili ağaç örneğidir.

ikilizincir.jpg

Yukarıdaki bu ağacın ilk örnekten farkı dengesiz olması ve özel olarak her düğümün çocuk sayısının 1 olmasıdır. Tanım hatırlanacak olursa yukarıdaki bu ağaç da bir ikili ağaç olarak kabul edilebilir.

C dilinde bir ikili ağacı ifade edecek struct aşağıdaki şekilde yazılabilir:

typedef struct dugum{
int veri;
dugum *sol;
dugum *sag;
};

Yukarıdaki kodda bir düğümün taşıması gereken bilgiler tanımlanmıştır. Buna göre düğümün sağındaki ve solundaki çocukları gösteren birer gösterici (pointer) ve düğümün içindeki veriyi tutan bir veri değişkeni bulunmaktadır.

Benzer durum java dilinde aşağıdaki şekilde ifade edilebilir:

class dugum{
int veri;
dugum sol;
dugum sag;
};

Yukarıdaki kodda ise nesne göstericisi (object referrer) kullanılarak bir nevi gösterici (pointer) yapısı kullanılmıştır. Buna göre her düğümün sol ve sağında gene düğüm cinsinden birer nesne bulunabilecektir.

Daha fazla bilgi için ikili ağaçların özel bir hali olan ikili arama ağaçlarına (binary search tree) bakabilirsiniz.

Bu yazıyı beğendiyseniz, başkalarının da ilgisini çekebilirsiniz:


1,331 views

4 responses to “İkili Ağaç (Binary Tree)”
  1. merve says:

    Merhaba hocam;
    Parametre olarak girilen level degerinden buyuk olan level’deki node sayisini döndüren bir fonksiyona ihtiyacım var hocam.Mesela (level=3 ise 4,5,… levellerdeki node sayisinı döndürücek).Ayrıca ağacımı Binary Tree yapısında.Verceğiniz cevap için şimdiden çok teşekkür ederim.

  2. Kabaca bir ağacı dolaşırken kaçıncı seviyede olduğunuzu tutmanız yeterlidir. Kabaca aşağıdaki şekilde bir müsvette kod yazılabilir.

    int dolas(int seviye, int limit, node *dugum){
       int sayi = 0;
       if(dugum->sol !=NULL){
        if(seviye >= limit)
          sayi =  1 + dolas(seviye + 1 , limit, dugum->sol);
        else
          sayi = dolas(seviye + 1 , limit, dugum->sol);
       }
       if(dugum->sağ !=NULL){
        if(seviye >= limit)
          sayi = sayi + 1 + dolas(seviye + 1 , limit, dugum->sağ);
        else
          sayi = sayi + dolas(seviye + 1 , limit, dugum->sağ);
       }
       return sayi;
    }
    
  3. olcay says:

    Hocam ben ikili ağaç yapısında ekleme fonsiyonu yazdım.yazdığım fonsiyon kok degerinden kucuk degerleri kayıt edıyor fakat buyuk degerlerde sistem hata veriyor windows calısmayı durduruyor.oluşturduğum yapıda pointerların sırasını değiştirdiğimde bu sefer tam tersi yani buyukleri ekleyi kucukler için hata veriyor.yazdığım fonksiyon şudur hocam..

    typedef struct data{
                         int veri;
                         data *sag;
                         data *sol;
                         };
    
                         data *kok =(data *)malloc(sizeof(data));
                         data *gkok;
     void ekle(int cocuk){
                          gkok = kok;
                        while(1){
                                  if (cocuk == gkok->veri){
                                   cout<<"sayi zaten var"<<endl;
                                   break;
                                                          }
    
                                 if(cocuk veri){
    
                                                      if(gkok->sol == 0){
                                                                   gkok->sol = (data *)malloc(sizeof(data));
                                                                   gkok = gkok->sol;
                                                                   gkok->veri =cocuk;
    
                                                                   break;
                                                                         }
                                                if(gkok->sol != 0){
                                                     gkok= gkok->sol;}
    
                                                      }
                                  if(cocuk > gkok->veri){
                                                      if(gkok->sag == 0){
                                                                   gkok->sag = (data *)malloc(sizeof(data));
                                                                   gkok = gkok->sag;
                                                                   gkok->veri =cocuk;
    
                                                                 break;
                                                                         }
                                                   if(gkok->sag != 0){
                                                   gkok=gkok->sag;}                
    
                                                      }
    
                                          }
                                          }
    
  4. Sorunuz sanırım ikili arama ağacı (Binary search tree) kodlaması ile ilgili. Yani soldaki değerlerin atalarından (parent) küçük ve sağdaki değerlerin büyük olmasını istiyorsunuz.

    Bunu yapan bir kodu zaten daha önce aşağıdaki adreste anlatmıştım.

    http://www.bilgisayarkavramlari.com/2008/05/07/ikili-arama-agaci-binary-search-tree/

    Ayrıca ekleme fonksiyonunu da yine aynı yazının altında gelen bir soru üzerine yorum olarak yazmıştım. Tam çözümü bulunuyor ve buradan faydalanabilirsiniz. Yine de anlaşılmayan birşey veya soracağınız birşey olursa lütfen sorun elimden geldiğince cevaplamaya çalışırım.

    Başarılar

Leave a Reply


9 * bir =

Benzer Yazılar:

Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'İkili Ağaç (Binary Tree)' isimli yazı 07 May 2008 tarihinde, saat: 05:11 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam1,331 defa okunmuştur.

Benzer yazıları Automata (otomatlar, özdevinirler), C/C++, JAVA, Nesne Yönelimli Programlama, Programlama Dilleri, Temel Bilimler, 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.


Category: Automata (otomatlar, özdevinirler), C/C++, JAVA, Nesne Yönelimli Programlama, Programlama Dilleri, Temel Bilimler, veri yapıları