Bölüm 9: Ağaçlar
Çoktan Seçmeli · Ağaç Kavramı
Soru 1: Kenar Sayısı ve Döngü
Bağlantılı (connected), 10 düğümlü ve 10 kenarlı bir yapı için hangisi kesinlikle doğrudur?
B. n düğümlü ağaçta her zaman n − 1 = 9 kenar vardır. Bağlantılı bir yapıya 10. kenar eklenirse zaten yolu olan iki düğüm ikinci kez bağlanır ve döngü oluşur. A yanlıştır: bağlantılı olmak yetmez, kenar sayısı da n − 1 olmalıdır.
Çoktan Seçmeli · Ağaç Kavramı
Soru 2: Ağaç İlişkileri
Şekildeki ağaç için hangisi doğrudur?
D. Atalar, düğümden köke giden yoldaki düğümlerdir: Y → W → Q → R. A yanlıştır: U'nun ebeveyni P, V'ninki Q; aynı derinlikte olmak kardeşlik için yetmez. B'de X eksik: soy, alt ağacın tamamıdır (T, U, X). S'nin çocuğu yoktur, yapraktır.
Klasik Soru · Ağaç Kavramı
Soru 3: Derinlik ve Yükseklik
Şekildeki ağaçta P, W ve X düğümlerinin derinliğini ve yüksekliğini kenar sayısıyla bulun. Ağacın yüksekliği kaçtır?
Cevabı göster
| Düğüm | Derinlik | Yükseklik |
|---|---|---|
| P | 1 | 2 (P→T→X) |
| W | 2 | 1 (W→Y) |
| X | 3 | 0 (yaprak) |
Derinlik kökten aşağı (R'nin derinliği 0), yükseklik düğümden en uzak yaprağa doğru ölçülür.
Ağacın yüksekliği = kökün yüksekliği = en büyük derinlik = 3 (R→P→T→X ya da R→Q→W→Y).
Düğüm sayısıyla ölçen kaynaklarda tüm değerler 1 fazla çıkar (ağaç yüksekliği 4).
Çoktan Seçmeli · Ağaç Kavramı
Soru 4: ADT ile yukseklik(Q)
Aşağıdaki metot şekildeki ağaçta yukseklik(Q) için çağrılıyor. Dönen değer ve metodun toplam çağrılma sayısı nedir?
int yukseklik(Konum<E> p) { int h = 0; for (Konum<E> c : cocuklar(p)) h = Math.max(h, 1 + yukseklik(c)); return h; }
A. V yapraktır (0). W'nin çocukları Y, Z yaprak → W = 1. Q = max(1 + 0, 1 + 1) = 2. Yalnızca Q'nun alt ağacı gezilir: Q, V, W, Y, Z → 5 çağrı. B yanlıştır: yükseklik aşağı doğru bakar; ağacın geri kalanı (R, P, S…) ziyaret edilmez.
Klasik Soru · İkili Ağaçlar
Soru 5: Dolu, Tam, Mükemmel
Şekildeki T1 ve T2 ikili ağaçlarının her biri dolu (full), tam (complete) ve mükemmel (perfect) özelliklerinden hangilerini taşır?
Cevabı göster
| Dolu | Tam | Mükemmel | |
|---|---|---|---|
| T1 | evet | hayır | hayır |
| T2 | hayır | evet | hayır |
T1: her düğümün 0 ya da 2 çocuğu var → dolu. Ama 3'ün altı boşken en alt seviye 4'ün altında → son seviyeden önceki seviye dolu değil, tam değil.
T2: son seviye (4, 5, 6) soldan sağa boşluksuz → tam. 3'ün tek çocuğu var → dolu değil.
İkisi de mükemmel değildir: yapraklar aynı derinlikte değil (T1) ya da bir iç düğüm tek çocuklu (T2).
Çoktan Seçmeli · İkili Ağaçlar
Soru 6: Her Zaman Doğru Olan
Aşağıdakilerden hangisi her ikili ağaç için doğrudur?
B. Mükemmel ağaçta tüm iç düğümlerin 2 çocuğu var (dolu) ve tüm seviyeler dolu (tam). A ve C yanlıştır: dolu ve tam birbirini gerektirmez (önceki sorudaki T1 dolu ama tam değil, T2 tam ama dolu değil). D: tam ağaçta yapraklar son iki seviyeye dağılabilir.
Klasik Soru · İkili Ağaçlar
Soru 7: Yükseklik Sınırları
1000 düğümlü bir ikili ağacın yüksekliği en az ve en çok kaç olabilir? Gerekçelendirin.
Cevabı göster
En çok 999: her düğümün tek çocuğu olduğu çarpık (zincir) ağaçta h = n − 1.
En az 9 = ⌊log2 1000⌋. Yüksekliği h olan ikili ağaç en fazla 2h+1 − 1 düğüm tutar: h = 8 → 511 < 1000 yetmez; h = 9 → 1023 ≥ 1000 yeter.
Genel kural: ⌊log2 n⌋ ≤ h ≤ n − 1. Ağaç işlemleri yüksekliğe bağlı olduğundan dengeli ağaçta ≈ 10, çarpık ağaçta ≈ 1000 adım gerekir.
Klasik Soru · Gösterimler
Soru 8: Diziden Ağacı Çizme
Bir ikili ağaç 1 tabanlı dizide saklanmıştır (indis 0 kullanılmıyor, – boş hücre). Bu ağacı çizin.indis: 1 2 3 4 5 6 7 8 9 10a[i]: A B C D E – F – – G
Cevabı göster
1 tabanlıda sol = 2i, sağ = 2i + 1, ebeveyn = ⌊i/2⌋.
- B (2), C (3): A'nın sol ve sağ çocukları. D (4), E (5): B'nin çocukları.
- 6 boş → C'nin sol çocuğu yok; F (7) → C'nin sağ çocuğu.
- G (10): ebeveyn ⌊10/2⌋ = 5 → E; 10 çift → E'nin sol çocuğu.
Çoktan Seçmeli · Gösterimler
Soru 9: 0 Tabanlı İndis Formülü
Bir ikili ağaç 0 tabanlı dizide saklanıyor (kök indis 0'da). İndis 6'daki düğümün ebeveyninin ve sol çocuğunun indisleri nedir?
C. 0 tabanlıda ebeveyn = ⌊(i − 1)/2⌋ = ⌊5/2⌋ = 2, sol çocuk = 2i + 1 = 13 (sağ çocuk 14). A, 1 tabanlı formüller (⌊i/2⌋ ve 2i) kullanılınca çıkan sık bir hatadır.
Çoktan Seçmeli · Gösterimler
Soru 10: null Referans Sayısı
Sol/sağ referanslı bağlı gösterimde 50 düğümlü bir ikili ağaçta toplam kaç null çocuk referansı vardır?
D. Her düğümde 2 referans → 2n = 100. Bunlardan n − 1 = 49'u kenardır (kök hariç her düğümü ebeveyni gösterir). Kalan 100 − 49 = 51 = n + 1 referans null'dır. A, dolu referansların (kenarların) sayısıdır.
Klasik Soru · Gezinmeler
Soru 11: Kök Başta ve Kök Sonda
Şekildeki ikili ağacın kök başta (preorder) ve kök sonda (postorder) gezinme çıktılarını yazın.
Cevabı göster
Kök başta (kök → sol → sağ): F B A D C E G I H
Kök sonda (sol → sağ → kök): A C E D B H I G F
Kök başta çıktısının ilk öğesi, kök sonda çıktısının son öğesi köktür (F). G'nin sol çocuğu olmadığından kök başta G'den hemen sonra sağ alt ağaç (I, H) gelir.
Karşılaştırma: kök ortada çıktısı A B C D E F G H I sıralıdır → bu ağaç bir BST'dir.
Adım Adım Çalıştırma · Gezinmeler
Soru 12: Yığın ile Kök Ortada
Kökü 8 olan ağaçta (8'in çocukları 3 ve 10; 3'ün çocukları 1 ve 6; 10'un yalnızca sağ çocuğu 14) kokOrtadaYigin(kok) ne yazdırır? (yigin: alt → üst)
gecici kökten (8) başlar; yığın boş.
8 itilir (sonra yazdırılacak), gecici = 8.sol = 3. Sola inmeye devam.
3 itilir, gecici = 3.sol = 1.
1 itilir, gecici = 1.sol = null. Sola gidilecek yer kalmadı.
gecici null → 1 çıkarılıp yazdırılır. gecici = 1.sag = null.
gecici null → 3 çıkarılıp yazdırılır. gecici = 3.sag = 6.
6 itilir, gecici = 6.sol = null.
6 çıkarılıp yazdırılır; gecici = 6.sag = null.
8 çıkarılıp yazdırılır (sol alt ağacı bitti); gecici = 8.sag = 10.
10 itilir, gecici = 10.sol = null.
10 çıkarılıp yazdırılır; gecici = 10.sag = 14.
14 itilir, gecici = 14.sol = null.
14 çıkarılıp yazdırılır; gecici = 14.sag = null.
Yığın boş ve gecici null → döngü biter. Çıktı sıralı (sol → kök → sağ); her düğüm bir kez itilip çıkarılır: O(n) zaman, O(h) yığın.
void kokOrtadaYigin(AgacDugumu kok) { Deque<AgacDugumu> yigin = new ArrayDeque<>(); AgacDugumu gecici = kok; while (!yigin.isEmpty() || gecici != null) { if (gecici != null) { yigin.push(gecici); gecici = gecici.sol; } else { gecici = yigin.pop(); System.out.print(gecici.veri + " "); gecici = gecici.sag; } } }
Çoktan Seçmeli · Gezinmeler
Soru 13: Yığınlı Kök Başta Hatası
Aşağıdaki yığınlı kök başta kodu, 1'in çocukları 2 ve 3, 2'nin 4 ve 5, 3'ün 6 ve 7 olan ağaçta ne yazdırır?
void kokBastaYigin(AgacDugumu kok) { Deque<AgacDugumu> yigin = new ArrayDeque<>(); yigin.push(kok); while (!yigin.isEmpty()) { AgacDugumu g = yigin.pop(); System.out.print(g.veri + " "); if (g.sol != null) yigin.push(g.sol); if (g.sag != null) yigin.push(g.sag); } }
B. Önce sol, sonra sağ itildiği için sağ çocuk yığının üstünde kalır (LIFO) ve önce o işlenir → kök, sağ, sol. Doğru kök başta için önce sağ, sonra sol itilmelidir; o zaman çıktı A (1 2 4 5 3 6 7) olurdu.
Adım Adım Çalıştırma · Gezinmeler
Soru 14: Kuyruk ile Seviye Sırası
Şekildeki ağaçta seviyeSirasi(kok) ne yazdırır? Her adımda kuyruğun içeriğini izleyin (kuyruk: ön → arka).
Kök kuyruğa eklenir. Kuyruk FIFO: önce eklenen önce çıkar.
poll() → F yazdırılır. F'nin çocukları B ve G arkaya eklenir.
poll() → B yazdırılır. B'nin çocukları A ve D, G'nin arkasına eklenir: önce 1. seviye bitecek.
poll() → G yazdırılır. G'nin sol çocuğu yok; yalnızca sağ çocuk I eklenir.
poll() → A yazdırılır. A yaprak: eklenecek çocuk yok.
poll() → D yazdırılır. D'nin çocukları C ve E eklenir.
poll() → I yazdırılır. I'nın yalnızca sol çocuğu H eklenir.
poll() → C yazdırılır. C yaprak.
poll() → E yazdırılır. E yaprak.
poll() → H yazdırılır. H yaprak; kuyruk boşaldı.
Kuyruk boş → döngü biter. Çıktı seviye seviye: F B G A D I C E H. Kuyrukta en çok 3 düğüm bulundu: ek bellek O(w), w = en geniş seviye.
void seviyeSirasi(AgacDugumu kok) { if (kok == null) return; Queue<AgacDugumu> kuyruk = new LinkedList<>(); kuyruk.add(kok); while (!kuyruk.isEmpty()) { AgacDugumu g = kuyruk.poll(); System.out.print(g.veri + " "); if (g.sol != null) kuyruk.add(g.sol); if (g.sag != null) kuyruk.add(g.sag); } }
Klasik Soru · Gezinmeler
Soru 15: İfade Ağacı
Şekildeki ifade ağacının sonek (postfix) gösterimini yazın ve hesapla() metodunun (yaprak → sayı, iç düğüm → işleç) döndüreceği değeri bulun.
Cevabı göster
Sonek = kök sonda gezinme: 6 2 + 3 × 8 4 / −
Değer: 6 + 2 = 8 → 8 × 3 = 24; 8 / 4 = 2; 24 − 2 = 22.
hesapla() kök sonda mantığıyla çalışır: bir işleç ancak iki alt ağacının değeri hesaplandıktan sonra uygulanır.
Karşılaştırma: önek (kök başta) − × + 6 2 3 / 8 4; ara ek (kök ortada) parantezsiz 6 + 2 × 3 − 8 / 4 yanlış okunur, her alt ağaç paranteze alınmalı: ((6 + 2) × 3) − (8 / 4).
Klasik Soru · Gezinmeler
Soru 16: Gezinmelerden Ağacı Kurma
Bir ikili ağacın gezinmeleri verilmiştir. Ağacı çizin ve kök sonda çıktısını yazın.Kök başta: 1 2 4 7 3 5 6 8Kök ortada: 4 7 2 1 5 3 8 6
Cevabı göster
Kök başta ilk öğe kök: 1. Kök ortada 1'in solu {4, 7, 2}, sağı {5, 3, 8, 6}. Sol: sıradaki 2 kök; solunda {4, 7}, sağı boş. 4 kök, 7 onun sağ çocuğu. Sağ: 3 kök; solu {5}, sağı {8, 6} → 6 kök, 8 sol çocuğu.
Kök sonda: 7 4 2 5 8 6 3 1
Çoktan Seçmeli · Gezinmeler
Soru 17: Gezinmelerin Ek Belleği
n düğümlü mükemmel ikili ağaçta kuyrukla seviye sırası gezinmenin ve özyinelemeli kök ortada gezinmenin ek belleği sırasıyla nedir?
A. Kuyruk en geniş seviye kadar büyür (O(w)); mükemmel ağaçta son seviyede ≈ n/2 düğüm vardır → O(n). Özyineleme ise O(h) çerçeve kullanır, mükemmel ağaçta h = log2(n + 1) − 1 → O(log n). B, seviye sırasının belleğini yükseklikle karıştırır. İkisinin de zamanı O(n)'dir.