Bölüm 9: Ağaçlar

Bölüm 9: Ağaçlar · Çalışma Soruları
Ağaç kavramıİkili ağaçlarGösterimlerGezinmelerÖzyinelemeli metotlarİfade ağacı ve yeniden kurma
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Ç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?

RPQSTUVWXYZ

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?

RPQSTUVWXYZ
Cevabı göster
DüğümDerinlikYükseklik
P12 (P→T→X)
W21 (W→Y)
X30 (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;
}
RPQSTUVWXYZ

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?

1234567123456T1T2
Cevabı göster
DoluTamMükemmel
T1evethayırhayır
T2hayırevethayı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 10
a[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.
ABCDEFG

Ç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.

FBGADICEH
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)

83101614
83101614

gecici kökten (8) başlar; yığın boş.

83101614

8 itilir (sonra yazdırılacak), gecici = 8.sol = 3. Sola inmeye devam.

83101614

3 itilir, gecici = 3.sol = 1.

83101614

1 itilir, gecici = 1.sol = null. Sola gidilecek yer kalmadı.

83101614

gecici null → 1 çıkarılıp yazdırılır. gecici = 1.sag = null.

83101614

gecici null → 3 çıkarılıp yazdırılır. gecici = 3.sag = 6.

83101614

6 itilir, gecici = 6.sol = null.

83101614

6 çıkarılıp yazdırılır; gecici = 6.sag = null.

83101614

8 çıkarılıp yazdırılır (sol alt ağacı bitti); gecici = 8.sag = 10.

83101614

10 itilir, gecici = 10.sol = null.

83101614

10 çıkarılıp yazdırılır; gecici = 10.sag = 14.

83101614

14 itilir, gecici = 14.sol = null.

83101614

14 çıkarılıp yazdırılır; gecici = 14.sag = null.

83101614

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).

FBGADICEH
FBGADICEH

Kök kuyruğa eklenir. Kuyruk FIFO: önce eklenen önce çıkar.

FBGADICEH

poll() → F yazdırılır. F'nin çocukları B ve G arkaya eklenir.

FBGADICEH

poll() → B yazdırılır. B'nin çocukları A ve D, G'nin arkasına eklenir: önce 1. düzey bitecek.

FBGADICEH

poll() → G yazdırılır. G'nin sol çocuğu yok; yalnızca sağ çocuk I eklenir.

FBGADICEH

poll() → A yazdırılır. A yaprak: eklenecek çocuk yok.

FBGADICEH

poll() → D yazdırılır. D'nin çocukları C ve E eklenir.

FBGADICEH

poll() → I yazdırılır. I'nın yalnızca sol çocuğu H eklenir.

FBGADICEH

poll() → C yazdırılır. C yaprak.

FBGADICEH

poll() → E yazdırılır. E yaprak.

FBGADICEH

poll() → H yazdırılır. H yaprak; kuyruk boşaldı.

FBGADICEH

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.

−×/+38462
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 8
Kö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.

12345678

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));
}
DBEGACF

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?

DFHJKM
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);
}
134678101314
Cevabı göster
  • boyut = 9, yaprakSayisi = 4 (1, 4, 7, 13).
  • boyut her düğümde iki çocuğu için de çağrılır: 9 düğüm + n + 1 = 10 null → 19 çağrı (2n + 1).
  • yaprakSayisi yaprakta 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.

Son

Bölüm 9: Ağaçlar: Çalışma Soruları
Konu anlatımı: Ağaçlar sunumu
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.