Bölüm 7: Ağaçlar
Klasik Soru · Ağaç
Soru 1: Ağaç Gezinmeleri
Kökü 45 olan ikili ağaç için (a) kök önde (preorder), (b) kök ortada (inorder), (c) kök sonda (postorder) ve (d) seviye sıralı (level-order) gezinme çıktılarını yazınız. (e) Ağacın yüksekliği ve yaprakları nelerdir?
Cevabı göster
- (a) Preorder:
45 22 10 5 30 25 35 70 60 85 80 - (b) Inorder:
5 10 22 25 30 35 45 60 70 80 85 - (c) Postorder:
5 10 25 35 30 22 60 80 85 70 45 - (d) Level-order:
45 22 70 10 30 60 85 5 25 35 80 - (e) Yükseklik: 3 (kökten en derin yaprağa kenar sayısı). Yapraklar: 5, 25, 35, 60, 80.
Inorder çıktısı sıralı olduğu için bu ağaç bir ikili arama ağacıdır. Level-order gezinme kuyrukla yapılır.
Klasik Soru · Ağaç
Soru 2: Gezinmelerden Ağacı Kurma
Bir ikili ağacın gezinmeleri verilmiştir. Ağacı çiziniz ve postorder çıktısını yazınız.Preorder: A B D E C F G HInorder: D B E A F C G H
İpucu: Preorder'ın ilk elemanı köktür. Inorder'da kökün solu sol alt ağaç, sağı sağ alt ağaçtır. Aynı adımı alt ağaçlara özyinelemeli uygulayın.
Cevabı göster
Kök A. Inorder'da A'nın solu {D, B, E}, sağı {F, C, G, H}.
Sol: preorder'da sıradaki B → kök B, solu D, sağı E.
Sağ: sıradaki C → kök C, solu F, sağı {G, H}; G kök, H onun sağ çocuğu.
Postorder: D E B F H G C A
Not: Yalnızca preorder + postorder ile ağaç her zaman tek türlü kurulamaz; inorder gereklidir.
Klasik Soru · Ağaç
Soru 3: Ağacın Dizi Gösterimi
Tam ikili ağaç 0 indisli dizide saklanıyor: [50, 30, 70, 20, 40, 60, 80, 10].
(a) i. düğümün sol/sağ çocuğu ve ebeveyni hangi indistedir?
(b) 40'ın ebeveyni ve 20'nin çocukları nelerdir?
(c) Ağacı çiziniz; yüksekliği nedir?
(d) Bu gösterim neden "tam" ağaçlar için uygundur?
Cevabı göster
- (a) sol =
2i + 1, sağ =2i + 2, ebeveyn =(i − 1) / 2(tam sayı bölmesi). - (b) 40 indis 4 → ebeveyn (4−1)/2 = 1 → 30. 20 indis 3 → sol 7 → 10, sağ 8 → yok (n = 8).
- (c) Yükseklik ⌊log₂8⌋ = 3.
- (d) Tam ağaçta dizide boşluk kalmaz; işaretçi tutmaya gerek yoktur. Dengesiz bir ağaçta boş indisler belleği israf eder (en kötü 2ⁿ hücre).
Klasik Soru · Ağaç
Soru 4: Özyinelemeli Ağaç Metotları
Dugum sınıfında veri, sol, sag alanları vardır. Aşağıdaki metotları özyinelemeli olarak yazınız:
(a) yaprakSay(kok)
(b) yukseklik(kok) (boş ağaç −1, tek düğüm 0)
(c) toplam(kok): tüm değerlerin toplamı
Yukarıdaki 45 köklü ağaç için sonuçlar nedir?
Cevabı göster
int yaprakSay(Dugum k) { if (k == null) return 0; if (k.sol == null && k.sag == null) return 1; return yaprakSay(k.sol) + yaprakSay(k.sag); } int yukseklik(Dugum k) { if (k == null) return -1; return 1 + Math.max(yukseklik(k.sol), yukseklik(k.sag)); } int toplam(Dugum k) { if (k == null) return 0; return k.veri + toplam(k.sol) + toplam(k.sag); }
45 köklü ağaç: yaprak = 5, yükseklik = 3, toplam = 467.
Her düğüm bir kez ziyaret edilir: O(n) zaman; yığın derinliği O(h).
Klasik Soru · Ağaç
Soru 5: Düğüm Sayıları
(a) Yüksekliği 4 olan mükemmel ikili ağaçta kaç düğüm ve kaç yaprak vardır?
(b) 100 düğümlü tam ikili ağacın yüksekliği nedir?
(c) 100 düğümlü bir ikili ağacın en büyük yüksekliği nedir?
(d) Dolu (full), tam (complete) ve mükemmel (perfect) ağaç farkı nedir?
Cevabı göster
- (a) Düğüm = 2h+1 − 1 = 2⁵ − 1 = 31; yaprak = 2h = 16.
- (b) ⌊log₂100⌋ = 6 (2⁶ = 64 ≤ 100 < 128).
- (c) Her düğümün tek çocuğu olursa (zincir) yükseklik n − 1 = 99.
- (d) Dolu: her düğümün 0 ya da 2 çocuğu var. Tam: son seviye hariç tüm seviyeler dolu, son seviye soldan doldurulmuş. Mükemmel: tüm iç düğümlerin 2 çocuğu var ve tüm yapraklar aynı seviyede.
Çoktan Seçmeli · Ağaç
Test 1
15 düğümlü mükemmel ikili ağacın yüksekliği nedir? (Tek düğüm: 0)
2h+1 − 1 = 15 → h = 3.
Bir ikili ağaçta preorder = A B C, inorder = B A C. Postorder nedir?
Kök A; inorder'da solunda B, sağında C. Postorder: sol, sağ, kök → B C A.
Çoktan Seçmeli · Ağaç
Test 2
n düğümlü bir ikili ağaçta kaç tane null çocuk referansı vardır?
Toplam 2n referans var; n − 1 tanesi kenardır (kök hariç her düğümün bir ebeveyni var). 2n − (n − 1) = n + 1.
Ağacı seviye seviye (level-order) gezmek için hangi yapı kullanılır?
Kök kuyruğa konur; her çıkarılan düğümün çocukları sona eklenir. Bu, ağaç üzerinde BFS'dir.
Adım Adım Çalıştırma · Ağaç
Özyinelemeli Inorder Gezinme
Kökü 5 olan ağaçta inorder(kok) çağrısının çağrı yığınını ve çıktısını izleyin.
Önce tahmin edin: çıktı ne olur?
inorder(5): k null değil.
5 bekler; önce sol alt ağaç: inorder(3).
3 de önce soluna iner: inorder(2).
inorder(null): hemen döner.
Sol bitti: 2 yazdırılır.
2'nin sağı null; inorder(2) biter.
3'e dönülür ve 3 yazdırılır.
3'ün sağı null; inorder(3) biter.
Köke dönülür: 5 yazdırılır.
Sağ alt ağaç: inorder(8).
8'in solu null; 8 yazdırılır.
Tüm çağrılar döner. Çıktı sıralı → bu bir BST. Her düğüm bir kez: O(n); yığın derinliği O(h).
void inorder(Dugum k) { if (k == null) return; inorder(k.sol); System.out.print(k.veri + " "); inorder(k.sag); } // inorder(kok);
Ucu Açık Soru · Ağaç
Dosya Sistemi Ağacı
- Klasör ve dosyalardan oluşan bir dosya sistemini ağaçla modelleyin. Bir düğümde hangi alanlar olmalıdır? Neden ikili ağaç yetmez?
- Bir klasörün toplam boyutunu hesaplamak için hangi gezinme (preorder / inorder / postorder / level-order) uygundur? Klasör ağacını girintili yazdırmak için hangisi?
Örnek cevap ve değerlendirme ölçütleri
1. Genel ağaç: düğümde ad, tur (dosya/klasör), boyut, ebeveyn ve List<Dugum> cocuklar. Bir klasörün çocuk sayısı sınırsızdır; bu yüzden ikili ağaç (en fazla 2 çocuk) uymaz. (Gerekirse "ilk çocuk – sonraki kardeş" gösterimiyle ikili ağaca dönüştürülebilir.)
2. Toplam boyut: postorder. Önce tüm çocukların boyutu hesaplanır, sonra klasörünkü: boyut(k) = k.boyut + Σ boyut(c). Girintili listeleme: preorder. Klasör, içeriğinden önce yazılır; derinlik kadar girinti verilir. Inorder genel ağaçta tanımlı değildir. Level-order "en üst seviyedeki klasörler" gibi sorgular için kullanılır.
Değerlendirme: genel ağaç ve düğüm alanları · ikili ağacın neden yetmediği · doğru gezinme seçimi ve gerekçesi · özyinelemeli formül.