Merhaba arkadaşlar, kendi sitemdeki 107. , kodaman.org daki 1.yazım ile sizleri selamlıyorum …Bu yazımda ağaç ( tree ) veri yapısını irdeleyeceğiz, hem de ne irdeleme !Şunu en baştan söylemekte fayda var ; bir çok veri yapısı zaten Standart Template Library ( STL ) de olan veri yapıları yani hazır olarak var fakat bizim amacımız bedava kullanmayı değil de işin mantığını öğretmek ;)Mantığı öğrenmek sizin için çok önemli olacak çünkü belki ilerde başka bir veri yapısını da siz üreteceksiniz ve millet sizin hazır kütüphanenizi kullanacak, hoş olmaz mı ?!? :DÖncelikle size ağaç yapımızdaki structlarımızı bir tanıtayım ;struct dugum{int sayi;dugum *sol;dugum *sag;};struct agac{dugum *kok;int elemansayisi;void agacolustur();void ekle(dugum *);void yazdir();void preorder(dugum *);void inorder(dugum *);void postorder(dugum *);};
Devamında da işler şu şekilde gerçekleşecek ->Şimdi arkadaşlar, öncelikle ben programın tüm kodlarını koymadan önce size biraz structtaki preorder , inorder ve postorder nedir onları anlatayım ;Mesela ağacımız şu şekilde olsun ;

Oben IŞIK
Oben IŞIK

1- Sıralı (inorder) : İlk adımda sol alt ağaç sıralı şekilde dolaşılır (a-b-c). Kök düğüme uğranır (d). Son adımda sağ alt ağaç sıralı şekilde dolaşılır (e-f-g). Sonuçta ağaç sırasıyla a-b-c-d-e-f-g düğümlerine erişilerek gezilir.2- Kökten Başlayarak (preorder) : İlk adımda köke uğranır(d). Sol alt ağaç kökten başlayarak dolaşılır (b-a-c). Son adımda sol alt ağaç kökten başlayarak dolaşılır (f-e-g). Sonuçta ağaç sırasıyla d-b-a-c-f-e-g düğümlerine erişilerek gezilir.3-Sondan Başlayarak (postorder) : İlk adımda sol alt ağaç sondan başlayarak dolaşılır (a-c-b). İkinci adımda sağ alt ağaç sondan başlayarak dolaşılır (e-g-f). Son adımda ise köke uğranır(d). Sonuçta ağaç sırasıyla a-c-b-e-g-f-d düğümlerine erişilerek gezilir.Bunların da yanı sıra size ikili ağaç mantığından bahsetmek istiyorum ;

Oben IŞIK
Oben IŞIK

İkli ağaçlarda kök hücresinden başlayarak, eğer eklenecek düğümün veri kısmındaki değer, kök düğümünün veri kısmındaki değerden büyük ise sağ tarafa , küçük yada eşit ise sol tarafa eklenir.Bu şekilde olşturulan sıralı ikili ağaçta biliriz ki , sol alt ağaçtaki düğümlerde kökten küçük ya da köke eşit değerler, sağ alt ağaçtaki düğümlerde ise kökten büyük değerler bulunur.Örneğin soldaki ağaç :DŞimdi de programımızın kodlarını inceleyelim ;//OBEN ISIK – [email protected]#include #include #include using namespace std;struct dugum{int sayi;dugum *sol;dugum *sag;};struct agac{dugum *kok;int elemansayisi;void agacolustur();void ekle(dugum *);void yazdir();void preorder(dugum *);void inorder(dugum *);void postorder(dugum *);};void agac::preorder(dugum *p){if(p){cout << p->sayi << " ";preorder(p->sol);preorder(p->sag);}}void agac::inorder(dugum *p){if(p){inorder(p->sol);cout << p->sayi << " ";inorder(p->sag);}}void agac::postorder(dugum *p){if(p){postorder(p->sol);postorder(p->sag);cout << p->sayi << " ";}}void agac::agacolustur(){kok = NULL;elemansayisi = 0;cout << "Agac olusturuldu ;) " sag = NULL;if(kok == NULL){kok = yeni;cout << "Ilk eleman eklendi ! (" << kok->sayi << ")"sayi){if(tara->sol != NULL) { tara = tara->sol; }else{cout << tara->sayi << " dugumunun soluna " << yeni->sayi << " elemanini ekledim, sanirim :D " << endl;tara->sol = yeni;eklendi = true;}}else if ( yeni->sayi > tara->sayi){if(tara->sag != NULL) tara = tara->sag;else{cout << tara->sayi << " dugumunun sagina " << yeni->sayi << " elemanini ekledim, sanirim :D " << endl;tara->sag = yeni;eklendi = true;}}else { cout << "Kopya" << endl; return;}}if(eklendi == true) { elemansayisi++; }cout << "Eleman sayisi : " << elemansayisi << endl ;cout << "PREORDER :tt"; preorder(kok);cout << endl;cout << "INORDER :tt"; inorder(kok);cout << endl;cout << "POSTORDER :tt"; postorder(kok);cout << endl;}int main(){typedef agac veriyapisi;veriyapisi kayit;dugum yenikayit;kayit.agacolustur();for(int i=1;i<10 ;i++){cout << endl << "Eleman : ";cin>>yenikayit.sayi;kayit.ekle(&yenikayit);}system(“pause”);return 0;}
Kodlardan da anlaşılabileceği gibi aslında mantığı çok basit, aşağıdaki ağacı programımızla oluşturalım ve preorder , inorder ve postorder durumlarını inceleyelim.

Oben IŞIK
Oben IŞIK

Ağacımıza ilişkin veriler programa girildiğinde ;Agac olusturuldu ;)Eleman : 30Ilk eleman eklendi ! (30)Eleman : 2030 dugumunun soluna 20 elemanini ekledim, sanirim :DEleman sayisi : 2PREORDER : 30 20INORDER : 20 30POSTORDER : 20 30Eleman : 5030 dugumunun sagina 50 elemanini ekledim, sanirim :DEleman sayisi : 3PREORDER : 30 20 50INORDER : 20 30 50POSTORDER : 20 50 30Eleman : 1020 dugumunun soluna 10 elemanini ekledim, sanirim :DEleman sayisi : 4PREORDER : 30 20 10 50INORDER : 10 20 30 50POSTORDER : 10 20 50 30Eleman : 4050 dugumunun soluna 40 elemanini ekledim, sanirim :DEleman sayisi : 5PREORDER : 30 20 10 50 40INORDER : 10 20 30 40 50POSTORDER : 10 20 40 50 30Eleman : 6050 dugumunun sagina 60 elemanini ekledim, sanirim :DEleman sayisi : 6PREORDER : 30 20 10 50 40 60INORDER : 10 20 30 40 50 60POSTORDER : 10 20 40 60 50 30Eleman : 3540 dugumunun soluna 35 elemanini ekledim, sanirim :DEleman sayisi : 7PREORDER : 30 20 10 50 40 35 60INORDER : 10 20 30 35 40 50 60POSTORDER : 10 20 35 40 60 50 30Eleman : 4540 dugumunun sagina 45 elemanini ekledim, sanirim :DEleman sayisi : 8PREORDER : 30 20 10 50 40 35 45 60INORDER : 10 20 30 35 40 45 50 60POSTORDER : 10 20 35 45 40 60 50 30Eleman : 7560 dugumunun sagina 75 elemanini ekledim, sanirim :DEleman sayisi : 9PREORDER : 30 20 10 50 40 35 45 60 75INORDER : 10 20 30 35 40 45 50 60 75POSTORDER : 10 20 35 45 40 75 60 50 30Devam etmek için bir tuşa basın . . .
şeklinde bir ekran görüntüsü oluşur. :roll:Şimdi de ağacımızda rakam aramaya çalışalım ;Kodları vermeden önce sonucu vermek istiyorum ;Eleman sayisi : 9PREORDER : 30 20 10 50 40 35 45 60 75INORDER : 10 20 30 35 40 45 50 60 75POSTORDER : 10 20 35 45 40 75 60 50 30Hangi elemani ariyorsunuz ? : 35ARADIGIM : 35Siz 35 girdiniz ve ben de 35 elemanini 4.denemede buldum ;)Devam etmek için bir tuşa basın . . .
Şimdi program böyle diyo bakalım 4.denemede bulmuş muyuz 😉 İrdeleyelim ;1. 30 ile 35 karşılaştırıldı, 35>30 , o yüzden sağa dallanmalıyız2. 30 ile 50 karşılaştırıldı, 30<50 , o yüzden sola dallanmalıyız3. 30 ile 40 karşılaştırıldı, 30<40 , o yüzden sola dallanmalıyız4. 35 ile 35 karşılaştırıldı, TRUE RESULT ! :DPeki ya olmayan bir değeri aramaya çalışsak ne olacaktı ?Ben denedim programda ve böyle bir sonuç çıktı ;Hangi elemani ariyorsunuz ? : 100ARADIGIM : 100Olmayan deger aradin eline ne gecti ?Devam etmek için bir tuşa basın . . .
Kodları merak ediyorsunuz dimi 😀 , aslında mantığı tamamen ekleme ile aynı, inceleyince siz de anlayacaksınız.void agac::ara(dugum *eklenecek){dugum *tara;tara = kok;bool bulundu = false;int kacinci = 1;cout << "ARADIGIM : " << eklenecek-> sayi sayi){tara = tara->sol;kacinci++;}else if(eklenecek->sayi > tara->sayi){tara = tara->sag;kacinci++;}else { cout << "Siz " << eklenecek->sayi << " girdiniz ve ben de " << tara->sayi << " elemanini "<< kacinci << ".denemede buldum ;) " << endl; return;}}cout << "Olmayan deger aradin eline ne gecti ? " << endl;}
Not : struct yapımıza fonksiyonumuzu tanıtmayı unutmuyoruz, main fonksiyonumuzdan da aranacak elemanı aşağıdaki şekilde göndertebiliriz ;cout << "Hangi elemani ariyorsunuz ? : " ;int aranan;cin >> yenikayit.sayi;kayit.ara(&yenikayit);Buraya kadar sanırım bir çok birşey öğrendik,Programımızın şu ana kadar çalışan halini buraya tıklayarak indirebilirsiniz arkadaşlar.Ağaç yapısında veri silme başlı başına bir olay oldugu için başka bir konuda başlıca değineceğim.Umarım bu bilgileri iyi harmanlarsınız çünkü ilerde çok işinize yarayabilir bence :Dİyilikler dilerim, OBEN IŞIK .