Ağaçlar(Trees) AĞAÇ VERİ MODELİ

Benzer belgeler
Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

Ağaç (Tree) Veri Modeli

Veri Modelleri. Ağaç Veri Modeli. Ağaç Veri Modeli

Algoritma Geliştirme ve Veri Yapıları 2 Veri Modelleri. Mustafa Kemal Üniversitesi

Veri Yapıları. Ağaçlar

YZM 2116 Veri Yapıları

The Big O Notation. The Big O Notation

BIL222 Veri Yapıları ve Algoritmalar

enum tip_ismi{değer_1, değer_2,, değer_n} değişken_adı;

Algoritma Geliştirme ve Veri Yapıları 3 Veri Yapıları. Mustafa Kemal Üniversitesi

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

DOSYA ORGANİZASYONU. Ağaç Yapıları ÖZLEM AYDIN TRAKYA ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

BIP116-H14-1 BTP104-H014-1

Ağaçlar (Trees) Ağaçlar (Trees)

Göstericiler (Pointers)

AĞAÇ-TREE VERİ YAPISI

Algoritma Geliştirme ve Veri Yapıları 7 Liste ve Bağlantılı Liste. Mustafa Kemal Üniversitesi

BMB204. Veri Yapıları Ders 9. B+ Ağacı, Hash, Heap. Erdinç Uzun NKÜ Çorlu Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

Yrd. Doç. Dr. Caner ÖZCAN

Dosya Sıkıştırma (File Compression) Kütük Organizasyonu 1

Veri Yapıları. Amaçlar: Temel Veri Yapılarını Tanımlamalı Veri Yapılarını Veri Modeli ve Türlerini Öğreneceksiniz. İçindekiler:

Çanakkale Onsekiz Mart Üniversitesi. Bilgisayar Mühendisliği Bölümü

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

VERİ YAPILARI VE PROGRAMLAMA

Week 9: Trees 1. TREE KAVRAMI 3. İKİLİ AĞAÇ DİZİLİMİ 4. İKİLİ ARAMA AĞACI 2. İKİLİ AĞAÇ VE SUNUMU > =

Yrd. Doç. Dr. Caner ÖZCAN

ALGORİTMA VE PROGRAMLAMA II

Graf Veri Modeli. Düğümler kümesi. Kenarlar kümesi

ALGORİTMA VE PROGRAMLAMA II

Algoritma Geliştirme ve Veri Yapıları 8 Kuyruk ve Yığın Yapısı. Mustafa Kemal Üniversitesi

YZM 2116 Veri Yapıları

Değişkenler, içerisinde tek bir değer tutabilen yapılardır. Örneğin haftanın günlerini değişkenlerde tutmak istersek, her bir gün adı için bir

VERİ YAPILARI LİSTELER. Yrd. Doç. Dr. Murat GÖK Bilgisayar Mühendisliği Bölümü YALOVA ÜNİVERSİTESİ

ALGORİTMA VE PROGRAMLAMA I

BLM 112- Programlama Dilleri II. Hafta 4 İşaretçiler (Pointers)

YZM VERİ YAPILARI DERS#9: HASH FONKSİYONLARI

AĞAÇLAR. Doç. Dr. Aybars UĞUR

enum bolumler{elektronik, insaat, bilgisayar, makine, gida};

BÖLÜM III: Şebeke Modelleri. Şebeke Kavramları. Şebeke Kavramları. Şebeke Kavramları. Yönlü Şebeke (Directed Network) Dal / ok

Yrd. Doç. Dr. Caner ÖZCAN

ALGORİTMA VE PROGRAMLAMA I

Algoritma Geliştirme ve Veri Yapıları 1 Temel Algoritma Kavramları. Mustafa Kemal Üniversitesi

YZM 2116 Veri Yapıları

YZM 2116 Veri Yapıları

Pointer Kavramı. Veri Yapıları

Yrd. Doç. Dr. Caner ÖZCAN

VERİ YAPILARI. Yrd. Doç. Dr. Murat GÖK Bilgisayar Mühendisliği Bölümü YALOVA ÜNİVERSİTESİ HASH TABLOLARI.

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-3 İşaretçiler (Pointer) (Kısım-2)

Algoritmalar. Heap Sort. Bahar 2017 Doç. Dr. Suat Özdemir 1

Veri Yapıları Laboratuvarı

Yrd. Doç. Dr. Caner ÖZCAN

Algoritma Geliştirme ve Veri Yapıları 10 Graf Veri Modeli. Mustafa Kemal Üniversitesi

YZM ALGORİTMA ANALİZİ VE TASARIM DERS#9: AÇGÖZLÜ ALGORİTMALAR

Özyineleme (Recursion)

BMT207 VERİ YAPILARI DATA STRUCTURE

YZM 2116 Veri Yapıları

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

PROGRAMLAMAYA GİRİŞ. Öğr. Gör. Ayhan KOÇ. Kaynak: Algoritma Geliştirme ve Programlamaya Giriş, Dr. Fahri VATANSEVER, Seçkin Yay.

YZM 2116 Veri Yapıları

Arasınav Örnek Soruları Bahar 2018

AHMET YESEVİ ÜNİVERSİTESİ BİLİŞİM SİSTEMLERİ VE MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ LİSANS DÖNEM ÖDEVİ

Max - Min Heap Tree (Max ve Min Yığıt Ağaçları) Veri Yapıları ve Algoritmalar 2 - Mustafa EGE Ders Notları

Yrd. Doç. Dr. Caner ÖZCAN

AVL Agacı {\} /\ Suhap SAHIN Onur GÖK

Ağaç Yapıları (Tree Structures) Kütük Organizasyonu 1

DOSYA ORGANİZASYONU. Çarpışma çözümleme yöntemleri ÖZLEM AYDIN TRAKYA ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

6.Hafta Kıyım Fonksiyonu (Hashing), BST. Doğrudan erişim tabloları Çarpışmaları ilmekleme ile çözmek Kıyım fonksiyonu seçimi Açık adresleme

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

VERİ YAPILARI DERS NOTLARI BÖLÜM 1 GİRİŞ. Yard. Doç. Dr. Deniz KILINÇ

KARAKTER DİZGİLERİ, BAĞINTILAR, FONKSİYONLAR KESİKLİ MATEMATİKSEL YAPILAR

YZM ALGORİTMA ANALİZİ VE TASARIM DERS#6: AZALT VE FETHET YÖNTEMİ

Algoritmalara Giriş Ekim 17, 2005 Massachusetts Institute of Technology Profesörler Erik D. Demaine ve Charles E. Leiserson Dağıtım 15.

Veri Yapıları. Ağaçlar. Ağaçlar genel bilgi

HACETTEPE ÜNİVERSİTESİ BAHAR DÖNEMİ

sayi=3 harf=a reelsayi=8.72 Bellek durumu 5. İşaretç iler (pointers)

Öğr. Gör. Serkan AKSU 1

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

BMT 202 Web Tasarımı Bahar Dönemi. Yük. Müh. Köksal GÜNDOĞDU 1

Algoritma ve Programlamaya Giriş

Veri Yapıları. for(i=1;i<n;i++) { ekle=d[i]; for (k=i 1; k>=0 && ekle<=d[k] ;k ) D[k+1]=D[k]; /* Geriye kaydırılıyor*/

Manisa Celal Bayar Üniversitesi Yazılım Mühendisliği Bölümü YZM Veri Yapıları Dersi. Proje#2

Yrd. Doç. Dr. Caner ÖZCAN

Dr. Fatih AY Tel: fatihay@fatihay.net

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Dosya Sıkıştırma (File Compression) Kütük Organizasyonu 1

8. İŞARETCİLER (POINTERS)

Programlama Dilleri 3

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

NESNEYE YÖNELİK PROGRAMLAMA

Veri Yapıları ve Algoritmalar

Sunum İçeriği. Programlamaya Giriş

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

Veri Yapıları. Öğr.Gör.Günay TEMÜR Düzce Üniversitesi Teknolojis Fakültesi

VERİ YAPILARI. GRAPH LAR Düzce Üniversitesi Teknoloji Fakültesi ÖĞR.GÖR.GÜNAY TEMÜR 1

ALGORİTMA VE PROGRAMLAMA II

Algoritmalar ve Karmaşıklık

AĞAÇLAR TREES. Doç. Dr. Aybars UĞUR

C PROGRAMLAMA D İ L İ

Transkript:

Ağaçlar(Trees) AĞAÇ VERİ MODELİ Ağaç, verilerin birbirine sanki bir ağaç yapısı oluşturuyormuş gibi sanal olarak bağlanmasıyla elde edilen hiyerarşik yapıya sahip bir veri modelidir; bilgisayar yazılım dünyasında, birçok problemin çözümünde programcının karşısına çıkar. Örneğin kodlama/kod çözme işlemleri, dosya sistemi, oyunların olası hamleleri, dizinli dosya uygulamasında ve verinin hızlı arama yapılacak şekilde tutulmasında ağaç veri modeli kullanılarak gerçekleştirilir. En hızlı arama şekli, eğer asosiyatif bellek veya çırpı (hash) fonksiyonu kullanılmıyorsa, agaç veri modeli ile sağlanmaktadır; bu nedenle veri tabanlarında ve benzeri uygulamalarda arama işlemi ağaç veri modeline dayanılarak yapılır. Uygulamada birçok problemin çözümü veya modellenmesi, doğası gereği ağaç veri modeline çok uygun düşmektedir. Birbirinden farklı yapıda değişik ağaç çeşitleri vardır ve herbiri farklı bir probleme çözüm sunar. XHTML ile Ağaç Modeli örneği; <html xmlns= http://www.gelecek.net/2017/xhtml xml:lang= en lang= en > <head> <meta http-equiv= Content-Type content= text/html; charset=utf-8 /> <title>basit</title> </head> <body> <h1>basit bir web sayfası</h1> <ul> <li>birinci değer</li> <li>ikinci değer</li> </ul> <h2><a href= http://www.mustafacemors34.com >Mustafa ÖRS </a><h2> Cem

</body> </html> Bu kodlarında ağaçlardaki karşılığı bu resimdeki gibidir. 1.AĞAÇ ÜZERİNE TEMEL KAVRAMLAR Ağaç, bir kök işaretçisi, sonlu sayıda düğümleri ve onları birbirine bağlayan dalları olan bir veri modelidir; aynı aile soyagacında olduğu gibi hiyerarşik bir yapısı vardır ve soyağacında geçen birçok kavram ağaç veri modelinde de tanımlıdır. Örneğin çocuk ve kardeş düğüm, aile ve ata gibi birçok kavram ağaç veri modelinde de kullanılır. Genel olarak, veri, ağacın düğümlerinde tutulur; dallar ise düğümlerin birbiriyle bağlantısını gösterir. Bu nedenle, veri yapısı ağacın düğümü için tanımlanır; bu veri yapısı hem düğümde tutulacak veriyi, hem de düğüme yapılacak bağlantı bilgilerini içerecek şekilde tanımlanır.

Her ağacın bir kök işaretçisi vardır; ağaca henüz bir düğüm eklenmemiş ise agaç boştur ve kök işaretçisi NULL değerini içerir. Kök işaretçisine bağlı olan düğüm kök olarak adlandırılır; ağaç bunun etrafında serpilir. Kendisine hiçbir bağlantı yapılmayan düğümler yaprak(leaf) olarak adlandırılır. Kök ve yaprak dışındaki düğümlere ara düğüm denir. Ağacın herhangi bir dalı kesildiğinde ortaya alt ağaç çıkar; bir ağaç veya alt-ağaç birçok alt-ağacın birleşmesinden oluşabilir; alt-ağacın kendisi de ağaç özelliğindedir. Dolayısıyla ağaç veri modeli algoritmaları rekürsif programlama uygun olurlar.

Ağaç üzerine bazı tanımlar aşağıda verilmiştir. Çocuk(Child): Bir düğüme doğrudan bağlı olan düğümlere o düğümün çocukları denilir. Bir düğüme bağlı alt-ağaçların kökleri o düğümün çocuklarıdır. Yaprak düğümler çocuksuz düğümlerdir. Derece(Degree): Bir düğümden alt hiyerarşiye yapılan bağlantıların sayısıdır; yani çocuk veya alt-ağaç sayısıdır. Yaprak düğümlerin derecesi 0 (sıfır) olur. Tüm dürümlerin derecesi eşit olan ağaçlara homojen ağaç denilir. Kardeş(Sibling): Aynı düğüme bağlı olan düğümlere kardeş düğüm veya kısaca kardeş denilir. Bir düğümün kardeş sayısı bağlı olduğu düğümün derecesine eşittir.

Aile(Parent): Düğümlerin üst düğüme doğrudan bağlı oldukları düğüm aile olarak adlandırılır; diğer bir deyişle aile, kardeşlerin bağlı olduğu düğümdür. Ata(Ancestor) Torun(Descendant): Aile düğümünün daha üstünde kalan düğümlere ata denilir; çocuk düğüm ile ata düğüm arasında en az 2 uzunlukta yol olur. Torun, bir düğümün çocuğuna bağlı düğümlere denir. Orman(Forest): Ağaçlar kümesi orman olarak adlandırılır. Örneğin alfabedeki herbir karakter için oluşturulan sözlük ağaçları biraraya gelerek bir orman oluşturur. Yol(Path): Bir düğümden aşağıya doğru bir başka düğüme gidebilmek için üzerinden geçilmesi gereken düğümlerin listesidir; bir düğümden ancak kendi silsilesinde olan düğümlere yol olabilir. Yol uzunluğu ise, başlangıç ve bitiş düğümleri arasındaki dal sayısıdır; bu yol üzerindeki düğüm sayısının bir eksiğidir. Yaprakların yol uzunluğu 0 dır; yani yapraklardan herhangi bir düğüme yol yoktur. Kökten her yaprak düğüme birer yol vardır. Düzey(Level): İki düğüm arasındaki yolun üzerinde bulunan düğümlerin sayısıdır. Kök düğümün düzeyi 1, doğrudan köke bağlı düğümlerin düzeyi 2 dir. Derinlik(Depth): Bir düğümün köke olan uzaklığıdır; yani düzeyidir. Kök düğümün derinliği 1 dir. Bir ağacın derinliği de en uzak mesafede bulunan yaprak düğümün derinliğidir.

Yükseklik(Height): Bir düğümün kendi silsilesinde en uzak mesafedeki yaprak düğüme olan düzey sayısı yükseklik olarak adlandırılır. Ağacın yüksekliği kökün yüksekliğidir. 2.AĞAÇ TÜRLERİ İkili Arama Ağacı(Binary Search Tree): İkili arama ağacında bir düğüm en fazla iki tane çocuğa sahip olabilir ve alt/çocuk bağlantıları belirli bir sırada yapılır. Örneğin, küçük veya alfabetik olarak önce olanlar sola, büyük veya eşit olanlar sağ tarafa bağlanır. İkili arama ağaçlarında anahtar sözcük arama işlemi karmaşıklığını eğer ağaç dengeli ise 0(logN) olmasıdır. Rastgele verilerin girildiği uygulamalarda ağacın dengeli olmasa da dengeli olmaya yakın olduğu istatiksel olarak görülmüştür. Kodlama Ağacı(Coding Tree): Kodlama ağacı bir alfabdeki veya daha genel olarak bir kümedeki karakterlere kod atanması için kurulan ağaç şeklidir. Bu tür ağaçlarda kökten başlanıp yapraklara kadar olan yol üzerindeki bağlantı değerleri kodu verir. Kodlama ağacı denildiğinde ilk akla gelen Huffman kodlaması olmasına karşın çok çeşitli kodlama ağaçları kurulabilir. Sözlük Ağacı(Dictionary Tree): Sözlük ağacı bir sözlükte bulunan sözcüklerin tutulması için kurulan bir ağaç şeklidir. Amaç. arama işleminin en performanslı bir şekilde yapılması ve belleğin optimum kullanılmasıdır. Sözlük ağaçları biraraya gelip sözlük ormanını oluşturur. Bu ormanda alfabedeki karakter sayısı kadar ağaç vardır ve herbir ağacın kökü farklı karakterlerle başlar. Örneğin baba sözcüğü b ile başladığı için b ile başlayan sözlük ağacında aranır veya oraya eklenir.

Kümeleme Ağacı(Heap Tree): Kümeleme bir çeşit sıralama ağacıdır; aslında ikili arama ağacı da sıralama ağacıdır. Ancak kümeleme ağacında çocuk düğümler her zaman için aile düğümünden daha küçük değerlere sahip olur. Dolayısıyla kök düğüm en büyük değere sahip olurken yaprak düğümler kendi silsilesi içerisinde en küçük değerlere sahip olurlar. Bu tür ağaçların kullanımı için en iyi örnek öncelikli kuyruk uygulamasıdır. Bağıntı Ağacı(Expressin Tree): Bağıntı ağaçları bir matematiksel bağıntının ağaç şeklinde tutulması için tanımlanmış bir ikili ağaç uygulamasıdır. Bağıntı ağacının yapraklarda değişkenler veya sabit değerler bulunurken, kök ve ara düğümlerde de işlem değeri olan simgeler bulunur. Verilen denklemden bağıntı ağacı kurulması veya verilen ağaçtan denklemin çıkarılması için iç-takı, öntakı ve son-takı olarak adlandırılan üç değişik yöntem vardır. 3.AĞAÇLARIN TUTULMASI BELLEK ÜZERİNDE Ağacın bilgisayar belleğinde tutulması için indis-bağlantısı veya düğüm-bağlantısı yöntemleri kullanılmaktadır. İndis bağlantısı yaklaşımında ağacın düğümleri bir dizi üzerinde tutulurlar; dizinini ilk elemanı kök olup alt hiyerarşi deki diğer düğümlere bir bağlantı uyarınca erişilir. İndis bağlantısı, bir düğümün çocuklarına erişmek için gerekli indisi oandaki aile düğümün indis değerine göre hesaplamada kullanılır. Böylece hiçbir bağlantı bilgisi kullanılmadan bir düğümde onun herhangi bir çocuğuna indis hesabı yapılarak erişilebilir. Düğüm-bağlantısı olan yöntemde düğümler arası bağlantılar veri yapısı içerisine eklenmiş olan işaretçi değişkenler

aracılığıyla sağlanır Ağacın bellekte tutulması için iki farklı yöntem bulunur: Düğüm Bağlantısıyla Ağaç Kurulması/Veri Yapısı Bu yöntemde ilk akla gelen herbir bağlantı için birer bağlantı bilgisi tutulmasıdır; dolayısıyla veri yapısı içerisinde bilginin tutulacağı değişkenlere ek olarak m tane indis/işaretçi değişken olmalıdır. Bu yöntem, eğer ağacın derecesi, örneğin m=2, m=3 gibi, oldukça küçükse kullanılabilir; veya, eğer ağacın herbir düğüme ayrılan bağlantı bilgisi sayısı kadar bağlantı yapılmışsa uygulanabilir. Genel olarak bir ağaç düğümlerin derecesi ne olursa olsun yukarıdaki gibi veri yapısında iki tane bağlantı bilgisiyle bellekte tutulabilir. Biri, şekilde yatay olanlar, kardeş düğümleri, diğeri de, şekilde eğik olanlar çocuk düğümleri işaret eder. Kök düğümün bir tane bağlantısı var gibi görülse de diğer üç çocuk düğümüne V1 verisinin bulunduğu düğümden erişmektedir. Bu yöntem bellek alanından kazanç sağlar; ancak, programın yürütme zamanını arttırır. Çünkü, bir düğümünden onun çocuklarına doğrudan erişim ortadan kalkmış, bağlantı listede olduğu gibi ardışıl erişme ortaya çıkmıştır. struct ikili { Veri kısmı; İşaretçi Tipi sol, sağ; } AGAC2; İndis-Bağıntısıyla Ağaç Kurulması/Veri Yapısı Ağacın indis-bağıntısı yöntemine göre bellekte tutulması şekilde görüldüğü gibi düğümlerin veri kısmının bir dizi üzerinde tutulması kavramına dayanır. Dizinin ilk elamanı ağacın köküdür; daha sonraki elamanlar ağaç hiyerarşisi üzerindeki herhangi bir düğüme karşılık düşer. Ancak dizinin ikinci ve üçüncü elemanları kök düğümün çocuklarıdır; daha

sonraki, yani dördüncüden sonraki düğümler için ağacın derecesi bilinmelidir. Ağacın derecesine bağlı olarak bir indis bağıntısı bulunur ve düğümler arasındaki akrabalık ilişkileri bu bağıntı uyarınca belirlenir. Bu nedenle bu yöntem indis-bağıntısı olarak adlandırılır. Aşağıdaki şekilde düzeyli bir ikili ağaç olası tüm düğümleri gösterilmiştir; düğümler en üst hiyerarşiden, kök ten, başlanarak d0, d1 d14 olarak adlandırılmıştır. Düğümler b) de görüldüğü gibi yerleştirilirse bir bağıntı uyarınca herhangi bir düğümün çocuklarına doğrudan ulaşılabilir. İndis Bağıntısı Yönteminin Olumsuz Yanı Bu yöntem seyrek özellikte ağaçlar için fazla bellek alanı harcar. Çünkü, bu yöntemde ağacın olması gereken ama o andaki gelen verilere göre henüz olmayan düğümleri için de yer ayrılır. Dolayısıyla ağaç seyrek özellikte ise veya bazı alt ağaçları bağlantılı liste gibi tek bir yönde uzayıp giderse, eklemelerde ağacın düğümleri fazla artmadığı halde düzeyi artarsa bellek sarfiyatı oldukça artar. Şekilde böylesi durumlar bir ikili ağaç için gösterilmiştir; a) da olmayan 4 ve b) de de 11 tane düğümün yeri denklem 10.1 ve 10.2. yi sağlaması için boş bırakılmıştır. İndis Bağıntısı Yönteminin Olumlu Yanı Dolu veya dengeli ağaçların tutulmasında kullanışlıdır.

Özellikle, kendisi de özel bir dengeli ağaç olan kümeleme ağaçlarının (heap trees) tutulması için çok elverişlidir. 4.HUFF MAN KODLAMA AĞACI Kodlama ağacına dayanılarak değişken uzunlukta kod atanması, özellikle, veri sıkıştırma algoritmalarında başvurulan bir yöntemdir.

Kodlama tablosunda kod uzunluğu log2n bağıntısından hesaplanır. N=4 için log24=2 bulunur. Genişletilmiş ASCII tablosu için (256karakter) log2256=8elde edilir Bu amaçla Huffman, ShannonFano gibi birçok kodlama ağacı şekli geliştirilmiştir. Bunlar dışında, uygulamaya dönük özel kodlama ağaçları da oluşturulabilir. Huffman ile elde edilen sonuçlara göz atalım: Kodlama ağacı karakterlerin sıklığına göre oluşturulur. Kodlama ağacına göre BABACABA sözcüğünü kodlayıp kaç bit yer işgal ettiğini bulmak istersek; A harfine 0, B harfine 10, C harfine 110, D harfine 111 kodları atanmıştır. Buna göre BABACABA sözcüğü. 1001001100100 olarak kodlanır ve toplam 13 bit işgal eder. 5.İKİLİ AĞACI AĞAÇLAR VE İKİLİ ARAMA İkili Ağaç (Binary Tree) Agaç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: 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. 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: [crayon-5a000d20ae7d0658899893/] [crayon-5a000d20ae7e4647296638/] [crayon-5a000d20ae7ec002581513/] [crayon-5a000d20ae7f3857288400/] [crayon-5a000d20ae7fa103084657/] 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: [crayon-5a000d20ae801760649701/] [crayon-5a000d20ae809528284777/] [crayon-5a000d20ae80f051557896/] [crayon-5a000d20ae816446163117/] [crayon-5a000d20ae81d760810007/] 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. İkili ağaçlarda bir düğümün derecesi en fazla iki olabilir, yani en fazla iki tane çocuk bağlantısı olabilir. İkili arama ağacına bir düğüm eklenirken ağacın solunamı, sağınamı ekleme yapılacağı düğümün verialanı içerisindeki anahtar sözcüğe bakılarak yapılır. Bu konudaki genel yaklaşım, anahtar veri aile düğümünden küçük ise soluna büyük ise sağına eklemektir. Eğer anahtar veri sözce(string) ise alfabetik olarak önce geliyorsa soluna, sonra geliyorsa sağına eklenir. Bağıntı ağaçlarıda ikili ağaç şeklindedir; bağıntı ağacında amaç bir matematiksel bağıntıya ait operatör, değişken ve sabitleri bağıntıyı ifade edecek şekilde ikili ağaç üzerinde tutmaktır.ikili ağaçtaki bir düğüme ait veri yapısında veriye

ek olarak iki tane işaretçi tutulur; biri sol diğeri sağ olarak adlandırılan bu işaretçilere düğümün çocukları bağlanır. struct DUGUM2 { Veri kısmı; struct DUGUM2 *sol; struct DUGUM2 *sag; };

İkili ağaç üzerinde dolaşma İkili ağaç üzerinde önce -kök(preorder), ortada -kök(inorder) ve sonra-kök(postorder) olmak üzere üç farklı dolaşma şekli uygulamalara çözüm olmaktadır. Önce-Kök(preorder): Kök,Sol,Sağ Ortada Kök(inorder): Sol,Kök,Sağ Sonra-Kök(postorder):Sol,Sağ,Kök Önce kök yaklaşımda önce ağacın kökü, sonra sol altağaç ve ardından sağ altağaç Ortada kökta ise, önce sol altağaç, kök ve sağ altağaç Sonra kökte ise, önce sol altağaç, sonra sağ altağaç ve kök dolaşılır. Bağıntı Ağaçları Bir matematiksel bağıntının ağaç şeklinde tutulması için tanımlanmış bir ikili ağaç uygulamasıdır. Birçok derleyici, program içerisindeki denklemleri, bağıntı ağacı aracılığıyla ayrıştırır ve karşılığı olan kodları üretir. Bağıntı ağacı üç farklı yöntem ile çıkarılabilir: iç-takı, ön-takı ve sontakı. İç-takı (İnfix) Bağıntı ağacının iç-takı yöntemine göre değerlendirilmesi, bir önceki sayfada verilen örneklerde

görüldüğü gibi, matematikte alışılagelen şekilde, operatörlerin ortada, değişken veya sabit değerlerin operatörün kenarlarında bulunması şeklinde yapılır. Değerlendirmeye iki çocuğu da yaprak (yani parametreleri hazır; işleme hazır) olan en soldaki altağaçtan başlanır ve sağa doğru, sırasıyla, yine çocukları yaprak olan altağaçlar ele alınarak bağıntı değerlendirilir. Ön-takı (Prefix) ve Polonyalı Notasyonu Ön-takı yönteminde operatörler kendilerine karşı düşen parametrelerin (değişken veya sabit değerler) önündedir. Ön-takı yöntemi ikili ağaç üzerinde önce-kök dolaşması gibidir. Son-takı (Postfix) Son-takı yöntemi ters Polonyalı notasyonu (reverse Polish notation) olarak da adlandırılır ve operatörler kendi parametrelerinin arkasından gelir. Ön-takı ve sontakı yönteminin en önemli özelliği bağıntıların parantez kullanılmadan gösterilebilmesidir. İkili arama ağaçları arama işleminin yoğun olduğu uygulamalarda ilk başvurulan veri modelleridir; arama işleminde kullanılacak anahtar sözcüğe bağlı olarak bir veya birden fazla ikili arama ağacı kurularak arama işlemi logn mertebesinde yapılır.

İkili Arama Ağacı Uygulaması Ağacın herhangi bir düğümünde bir tamsayı ve bir de 100 karakterlik bir mesaj tutulacaktır, bunlara ek olarak biri sağ diğeri sol olmak üzere iki adet işaretçiye de sahip olmalıdır. Böyle bir düğümün veri yapısı;

struct topluluk{ AGAC2 int bilgi; bilgi, mesaj, sol, sag char mesaj[100]; struct topluluk *sol,*sag; }AGAC2; AGAC2 *kok=null; Bu aşamada bir ikili ağaç oluşmuş olur. Ancak içerisinde hiçbir düğüm yoktur. İlk yapılacak işlem ağaca düğüm ekleyecek algoritmanın tasarlanmasıdır. Bunun içinde her şeyden önce sıralamada kullanılacak olan anahtar sözcüğün belirlenmesidir. Bu örnekte, türü tamsayı olan bilgi adlı değişken anahtar veri olarak seçilmiştir. Dolayısıyla ikili ağaç üzerindeki ekleme, silme, arama gibi işlemler bu anahtar sözcük üzerinden gerçekleştirilecektir. /* Düğüm Ekleme Fonksiyonu */ void ekle(agac2 *agackok, AGAC2 *eklenen) { if(agackok==null) kok=eklenen; else{ if(eklenen->bilgi <= agackok->bilgi) { if(agackok->sol==null) agackok->sol=eklenen;

else ekle(agackok->sol, eklenen); } else { if(agackok->sag==null) agackok->sag=eklenen; elseekle(agackok->sag, eklenen); } } } /* Listedeki tüm kayıtları listeleme */ void listele(agac2 *agackok) { if(agackok=!null) { listele(agackok->sol); yazekrana(agackok); listele(agackok->sag); } } /* Ağaç üzerinde bir kayıt arama */ AGAC2 *ara(agac2 *agackok, int aranan) { while(agackok!=null && agackok->bilgi!=aranan) { if(aranan <= agackok->bilgi) agackok=agackok->sol;

else agackok=agackok->sag; } return agackok; } /* İkili ağaç üzerindeki düğüm sayısını sayar*/ int sayagacdugum(agac2 *agackok, int miktar) { if(agackok==null) return miktar; miktar++; miktar=sayagacdugum(agackok->sol, miktar); miktar=sayagacdugum(agackok->sag, miktar); return miktar; } İkili arama ağacı uygulamasının tam kodu [crayon-5a000d20ae831492291888/] Yazar: Mustafa Cem ÖRS Kaynak: Algoritma Geliştirme ve Veri Yapıları Üniversite Yayıncılık.