Ağaç Temelleri Tree Fundamentals
Ağaç terminolojisi, ağaç oluşturma, özyinelemeli tanım ve ağaç türlerine kapsamlı giriş.
Neden Ağaç?
Şimdiye kadar incelediğimiz yapılar — dizi, bağlı liste, stack, kuyruk — hep doğrusal (linear) yapılardı: elemanlar bir sıra halinde dizilir, her birinin en fazla bir önceki ve bir sonraki vardır. Ancak gerçek dünya verilerinin büyük kısmı doğrusal değil hiyerarşiktir: dosya sistemi (klasörler içinde klasörler), organizasyon şeması (müdür → şefler → çalışanlar), HTML DOM (etiketler içinde etiketler), soyağacı...
Doğrusal (Linear)
Hiyerarşik (Tree)
Ağaç, doğrusal yapılardan farklı olarak bir düğümün birden fazla alt düğüme sahip olmasına izin verir. Bu dallanma yapısı arama, sıralama ve organizasyon işlemlerini dramatik olarak hızlandırır. 1.000.000 elemanlı sıralı bir dizide ikili arama 20 adım alır — aynı veri ağaç yapısında da ~20 adımda bulunur, ama ekleme ve silme O(log n)'de kalır (dizide O(n)).
Tanım — Özyinelemeli (Recursive)
Biçimsel olarak: bir ağaç T ya boş kümedir (T = ∅) ya da bir kök düğüm r ve sıfır veya daha fazla boş olmayan alt ağaç T₁, T₂, ..., Tₖ'dan oluşur. Her Tᵢ'nin kökü r'ye bir kenarla (edge) bağlıdır.
Ağaç Terminolojisi
Aşağıdaki ağaç üzerinde tüm temel terimleri tanımlayacağız:
Temel Terimler
Derinlik, Yükseklik ve Seviye
Bu üç kavram sıkça karıştırılır. Aşağıdaki görsel ve tablo ayrımı netleştirir:
| Terim | Tanım | Yön | Örnekler |
|---|---|---|---|
| Derinlik (depth) | Kökten o düğüme kadar kenar sayısı | ↓ Yukarıdan aşağı | A:0, B:1, D:2, G:3 |
| Yükseklik (height) | O düğümden en uzak yaprağa kadar kenar sayısı | ↑ Aşağıdan yukarı | G:0, D:1, B:2, A:3 |
| Seviye (level) | Derinlikle aynı (bazı kaynaklarda +1) | ↓ Yukarıdan aşağı | A:0, B,C:1, D,E,F:2 |
| Ağaç yüksekliği | Kökün yüksekliği = en derin yaprağın derinliği | — | height(T) = 3 |
Derece (Degree)
Derece kavramı iki düzeyde kullanılır:
| Kavram | Tanım | Örnekler (referans ağaç) |
|---|---|---|
| Düğüm derecesi | Bir düğümün çocuk sayısı | A:2, B:2, C:1, D:2, E:0, F:0, G:0, H:0 |
| Ağaç derecesi | Tüm düğümlerin en büyük derecesi | max(2,2,1,2,0,0,0,0) = 2 |
Temel Özellikler
| Özellik | Formül | Açıklama |
|---|---|---|
| Kenar sayısı | n - 1 | n düğümlü ağaçta her düğüm (kök hariç) tam bir ebeveyne bağlıdır |
| Min yükseklik (ikili) | ⌊log₂ n⌋ | Tam dengeli ağaçta: n=7 → h=2, n=15 → h=3 |
| Max yükseklik | n - 1 | Dejenere (zincir) ağaçta: her düğümün 1 çocuğu |
| Max düğüm (ikili, h seviye) | 2^(h+1) - 1 | h=2 → max 7 düğüm, h=3 → max 15 düğüm |
| Yaprak sayısı (tam ikili) | ⌊n/2⌋ + 1 | Tam ikili ağaçta yaprak sayısı ≈ düğüm sayısının yarısı |
Ağaç Oluşturma
Ağaç düğümlerini bellekte temsil etmenin iki temel yolu vardır: bağlı yapı (linked — her düğüm pointer ile çocuklarına bağlı) ve dizi (array — indeks aritmetiği ile ebeveyn-çocuk ilişkisi). Bu bölümde ikili ağaç (binary tree) üzerinden her iki yöntemi göreceğiz.
Yöntem 1 — Bağlı Yapı (Linked)
Her düğüm bir struct'tır: veri + sol çocuk pointer + sağ çocuk pointer. Çocuğu olmayan yönler NULL'dur. Bu en yaygın ve en esnek gösterimdir.
Şimdi referans ağacımızı elle oluşturalım:
Yöntem 2 — Dizi Gösterimi (Array)
İkili ağaç bir dizide saklanabilir. Kök indeks 0'da bulunur. Herhangi bir i indeksindeki düğüm için:
Sol çocuk: 2*i + 1
Sağ çocuk: 2*i + 2
Ebeveyn: (i - 1) / 2 (tamsayı bölme)
Bağlı Yapı (Linked)
✓ Ekleme/silme pointer ile O(1)
✗ Ebeveyne erişim yok (tek yönlü)
✗ Extra bellek (2 pointer/düğüm)
Kullanım: BST, AVL, genel ağaçlar
Dizi (Array)
✓ Ebeveyn-çocuk O(1) indeks hesabı
✗ Dengesiz ağaçta büyük israf
✗ Ekleme/silme kaydırma gerektirebilir
Kullanım: Heap, tam/complete ağaçlar
Ağaç Türlerine Genel Bakış
Ağaç yapısının çeşitli özelleşmiş türleri vardır. Her biri belirli bir problemi çözmek için tasarlanmıştır. Önce ikili ağaç (binary tree) alt türlerini, sonra ileri düzey yapıları tanıyalım.
İkili Ağaç (Binary Tree) Alt Türleri
soldan sağa dolmuş
n = 2^(h+1) - 1
→ bağlı listeye dönüşür
h = O(log n) garantisi
| Tür | Tanım | Özellik |
|---|---|---|
| Full (Tam) | Her düğüm ya 0 ya 2 çocuğa sahip | Tek çocuklu düğüm yok |
| Complete (Eksiksiz) | Son seviye hariç tüm seviyeler dolu, son seviye soldan dolu | Dizi gösteriminde boşluk yok → heap için ideal |
| Perfect (Mükemmel) | Tüm iç düğümler 2 çocuklu, tüm yapraklar aynı seviyede | n = 2^(h+1) - 1 (h=3 → n=15) |
| Dejenere (Skewed) | Her düğümde en fazla 1 çocuk | Fiilen bağlı liste → arama O(n) |
| Dengeli (Balanced) | Her düğümde sol-sağ alt ağaç yükseklik farkı ≤ 1 | Arama/ekleme O(log n) garantisi |
İleri Düzey Ağaç Yapıları — Yol Haritası
İkili ağaç temel yapıdır; üzerine inşa edilen özelleşmiş yapılar farklı problemleri çözer:
BST (Binary Search Tree)
AVL Ağacı
Heap (Yığın)
B-Tree
Red-Black Tree
Trie (Prefix Tree)
Ağaçların Gerçek Dünya Kullanımları
| Alan | Ağaç Türü | Kullanım |
|---|---|---|
| Dosya sistemi | Genel ağaç (n-ary) | Klasörler ve dosyalar hiyerarşisi (/, /home, /usr...) |
| HTML/XML | Genel ağaç (DOM) | Etiket yapısı: <html> → <body> → <div> → ... |
| Veritabanı indeksi | B-tree / B+tree | MySQL, PostgreSQL, SQLite — milyonlarca satırda O(log n) arama |
| Derleyici | AST (Abstract Syntax Tree) | Kaynak kodu ayrıştırma: 3 + 4 * 5 → ağaç yapısı |
| Oyun AI | Minimax / Game Tree | Satranç, Go: hamle ağacı dallandırma + budama (alpha-beta) |
| Ağ yönlendirme | Trie | IP routing: en uzun önek eşleşmesi (longest prefix match) |
| Sıkıştırma | Huffman Tree | ZIP, JPEG: frekansa göre değişken uzunluklu kodlama |
| İşletim sistemi | Heap | Process scheduling: priority queue → binary heap |
Sonuç
Ağaç, doğrusal veri yapılarından hiyerarşik dünyaya geçiştir. Kök, yaprak, derinlik, yükseklik ve derece gibi temel terimler ağaç ailesi boyunca kullanılır. Bağlı yapı (pointer tabanlı) esneklik sağlarken, dizi gösterimi heap gibi complete ağaçlar için idealdir.
İkili ağacın beş alt türü — full, complete, perfect, dejenere ve dengeli — farklı yapısal garantiler sunar. Bu temeller üzerine BST, AVL, heap, B-tree, Red-Black tree ve trie gibi güçlü yapılar inşa edilir. Bir sonraki bölümde ikili ağacı derinlemesine inceleyeceğiz: dolaşma (traversal) yöntemleri, ekleme, silme ve ağaç ölçümleri.