10 - Ağaç (Tree) Veri Yapısı
2025
Ağaç, kenarlarla birbirine bağlanmış düğümlerden oluşan doğrusal olmayan hiyerarşik bir veri yapısıdır.
Diziler, bağlı liste, yığın ve kuyruk gibi diğer veri yapıları, verileri sıralı olarak depolayan doğrusal veri yapılarıdır.
Doğrusal bir veri yapısında herhangi bir işlemi gerçekleştirmek için veri boyutunun artmasıyla zaman karmaşıklığı da artar. Ancak bu durum günümüz hesaplama dünyasında kabul edilebilir değildir.
Ağaç veri yapıları, doğrusal olmayan bir veri yapısı olduğu için, verilere bağlı listelere göre daha hızlı ve kolay erişim sağlar, veri eklenmesinde esneklik gösterir.
Ağaç veri yapıları, sunduğu birçok avantaj sayesinde bilgisayar biliminin birçok alanında önemli bir yere sahiptir. Veri organizasyonu, erişim, temsil ve algoritma tasarımı gibi konularda oldukça faydalıdırlar.
Ağaç (tree) yapısı, bilgisayarda çok kullanılan soyut yapılardan birisidir. Önemi ve yaygınlığı nedeniyle, dersimizde yalnızca ikili ağaç yapıları konusunda giriş bilgilerini vereceğiz.
İkili ağaç yapısı ağaçta bir düğümden çıkan iki dal gibidir. Literatürde dallanma noktasına kök, ata(parent), gibi adlar verilir.
Dallara ise oğul, çocuk, sibling, yaprak gibi adlar verilir.
Biz genellikle ata ve oğul terimlerini kullanacağız. Ancak yeri geldiğinde anlamı kuvvetlendirmek için öteki adlardan da birisini kullanacağız.
Örneğin aşağıdaki ağaçta, en tepede olan 10 öğesine ağacın kökü diyeceğiz.
10
/ \
4 13
/ \ / \
3 7 11 15
Bu ağaçta {4,10,13}, {3,4,7}, {11,13,15} öğelerinden oluşan 3 düğüm (node) vardır. Her düğüm bir nesneyi gösterir. Her düğüm için ortadaki sayı ata, soldaki sol oğul, sağdaki sağ oğuldur. En tepedeki 10 öğesi 0. düzeydedir. {4,13} 1. düzeyde, {3,7,11,15} 2. düzeydedir.
Bu veri yapısını C’de aşağıdaki gibi temsil edebiliriz:
struct TreeNode {
int item; // düğümdeki veri
TreeNode *L; // sol alt ağacı gösteren işaretçi(pointer)
TreeNode *R; // sağ alt ağacı gösteren işaretçi(pointer)
}
İkili ağaç yapısında her düğümün iki tane işaretçisi (pointer) vardır. Birisi (L) sol yana ayrılan dalı, ötekisi sağ (R) yana ayrılan dalı gösterir.
Sol ve sağ dallardan birisi ya da her ikisi de NULL
gösterebilir. NULL
gösteren dal yok demektir. İkili ağacı bir ağacın gövdesinden çıkan dallara ve yapraklara benzetebiliriz.
Yaprak: Oğulu olmayan düğüme yaprak denir.
Kenar: Ağaç yapısındaki her öğeyi atasına bağlayan yukarıya doğru yönlenmiş çizgiye kenar denilir. Her kenar, ait olduğu öğeyi atasına bağlar. Bazı ataların hem sağ hem sol oğulları vardır. Bazılarının ise ya sağ ya sol olmak üzere birer tane oğulu vardır. Bazılarının da hiç oğulu yoktur ki onlar ağaç yapısında birer yapraktır.
Derinlik: Bir öğenin (ata, düğüm) derinliği, o öğeden başlayıp köke kadar giden kenar sayısıdır.
Yandaki ağaç için:
Yükseklik: Ağacın boyu hakkında bilgi veren, kök düğümden en uzaktaki yaprak düğüme kadar olan mesafeyi belirten kavramdır. Yandaki ağacın yüksekliği 4’tür.
Dolu Ağaç: Her düğümü iki oğula sahip olan ya da hiç oğulu olmayan (yaprak) düğümlerden oluşan ağaç yapısı doludur.
Tam Ağaç: Tabandakiler hariç, her düğümün iki oğulu olan ağaçtır. Yapraklar sola dayalı olmalıdır. Son düğümün sağ yaprağı olmak zorunda değildir. Yandaki ağaç hem dolu hem tam bir ağaçtır.
Aşağıda ağaçla ilgili verilen bilgilerden hangisi veya hangileri yanlıştır?
Örnek bir ikili ağaç kodunu C ile yapay zekaya yazdırıp:
işlevlerini test edin.