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 düzey 4'ün altında → son düzeyden önceki düzey dolu değil, tam değil.
T2: son düzey (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 düzeyler dolu (tam). A ve C yanlıştır: dolu ve tam birbirini gerektirmez (dolu olup tam olmayan ve tam olup dolu olmayan ağaçlar vardır). D: tam ağaçta yapraklar son iki düzeye 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 Önde ve Kök Sonda
Şekildeki ikili ağacın kök önde (preorder) ve kök sonda (postorder) gezinme çıktılarını yazın.
Cevabı göster
Kök önde (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 önde çı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 önde 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 Önde Hatası
Aşağıdaki yığınlı kök önde 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 önde 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 Düzey 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. düzey 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ı düzey düzey: F B G A D I C E H. Kuyrukta en çok 3 düğüm bulundu: ek bellek O(w), w = en geniş düzey.
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 önde) − × + 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 önde: 1 2 4 7 3 5 6 8Kök ortada: 4 7 2 1 5 3 8 6
Cevabı göster
Kök önde 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 düzey sırası gezinmenin ve özyinelemeli kök ortada gezinmenin ek belleği sırasıyla nedir?
A. Kuyruk en geniş düzey kadar büyür (O(w)); mükemmel ağaçta son düzeyde ≈ 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, düzey sırasının belleğini yükseklikle karıştırır. İkisinin de zamanı O(n)'dir.
Çoktan Seçmeli · Gezinmeler
Soru 18: Bağlı Ağaçta yukseklik
Dersteki metot şekildeki ağaçta yukseklik(A) ve yukseklik(F) için sırasıyla ne döndürür?
int yukseklik(AgacDugumu k) { if (k == null) return -1; return 1 + Math.max(yukseklik(k.sol), yukseklik(k.sag)); }
C: Yaprak F için 1 + max(−1, −1) = 0; en uzun yol A→B→E→G 3 kenardır. A, taban durum return 0 yazılmış gibi düğüm sayar (her değer 1 fazla). B, −1'i yaprağa verir; −1 yalnızca boş ağacın (null) yüksekliğidir. D iki ölçüyü karıştırır.
Klasik Soru · Gezinmeler
Soru 19: Euler Turu
Şekildeki ağacın etrafında Euler turu yapılıyor: her düğüme soldan, altından ve sağından uğranır. (a) Düğümler soldan, alttan ve sağdan geçilirken yazılırsa hangi üç sıra çıkar? (b) Turda toplam kaç uğrama vardır? (c) Sol çocuğu olmayan D'ye altından ne zaman uğranır?
Cevabı göster
(a) Soldan (kök önde): H D F K J M
Alttan (kök ortada): D F H J K M
Sağdan (kök sonda): F D J M K H
(b) Her düğüme 3 uğrama → 3n = 18. Üst simge 1, 2, 3 = soldan, alttan, sağdan:
H¹ D¹ D² F¹ F² F³ D³ H² K¹ J¹ J² J³ K² M¹ M² M³ K³ H³
(c) Sol alt ağaç boş olduğundan D'nin soldan ve alttan uğramaları ardışıktır (D¹ D²); bu yüzden kök ortada sırasında D, F'den önce gelir. Yapraklarda üç uğrama da ardışıktır. Tur O(n) sürer.
Çoktan Seçmeli · Gezinmeler
Soru 20: Kök Önde + Kök Sonda
Kök önde gezinmesi 1 2 4 3 5, kök sonda gezinmesi 4 2 5 3 1 olan kaç farklı ikili ağaç vardır?
D: 1 köktür; kök önde 1'den sonra 2, kök sonda 1'den önce 3 gelir → {2, 4} sol, {3, 5} sağ alt ağaçtır. Ama 4'ün 2'nin sol mu sağ çocuğu olduğunu iki gezinme ayırt etmez (ikisinde de 2 4 ve 4 2); 3 ile 5 için de aynı → 2 · 2 = 4 ağaç (kök ortada 4 2 1 5 3, 2 4 1 3 5, …). A, kök önde + kök ortada çiftinin tek belirleme özelliğini buraya taşır. Her düğümün 0 ya da 2 çocuğu varsa (dolu ağaç) bu çift de ağacı tek belirler.
Klasik Soru · Gezinmeler
Soru 21: boyut ve yaprakSayisi
Şekildeki ağaçta dersteki boyut(kok) ve yaprakSayisi(kok) ne döndürür? Her metot, ilk çağrı ve null ile yapılan çağrılar dahil, toplam kaç kez çağrılır?
int boyut(AgacDugumu k) { if (k == null) return 0; return 1 + boyut(k.sol) + boyut(k.sag); } int yaprakSayisi(AgacDugumu k) { if (k == null) return 0; if (k.sol == null && k.sag == null) return 1; return yaprakSayisi(k.sol) + yaprakSayisi(k.sag); }
Cevabı göster
boyut= 9,yaprakSayisi= 4 (1, 4, 7, 13).boyuther düğümde iki çocuğu için de çağrılır: 9 düğüm + n + 1 = 10 null → 19 çağrı (2n + 1).yaprakSayisiyaprakta durur, onun null çocuklarına inmez. Yalnızca 5 iç düğüm (8, 3, 6, 10, 14) ikişer çağrı yapar: 1 + 2 · 5 = 11 çağrı; bunların 2'si null'dır (10'un solu, 14'ün sağı).
İkisi de kök sonda mantığıyla çalışır: O(n) zaman, O(h) yığın alanı (burada h = 3).
Çoktan Seçmeli · Gezinmeler
Soru 22: Unutulan Yaprak Kontrolü
İşaretli satır silinirse yaprakSayisi(kok), n düğümlü boş olmayan bir ağaçta ne döndürür?
int yaprakSayisi(AgacDugumu k) { if (k == null) return 0; if (k.sol == null && k.sag == null) return 1; // silindi return yaprakSayisi(k.sol) + yaprakSayisi(k.sag); }
A: Yalnızca null için 0 döndüren taban durum kalır; hiçbir çağrı 1 üretmez, 0'ların toplamı 0'dır. B için yaprakta 1 döndüren satır gerekir. C, boyut'un 1 + terimiyle çıkar. D, taban durum k == null için 1 döndürseydi elde edilirdi: n düğümlü ikili ağaçta n + 1 null referans vardır.