Bölüm 7: Ağaçlar
Giriş
Öğrenme Çıktıları
Kök, ebeveyn, çocuk, yaprak, derinlik ve yükseklik terimlerini açıklamak.
Ağaçları düğüm bağlantıları ve dizilerle temsil etmek.
Kök önce, kök ortada, kök sonda ve seviye sıralı gezinmeyi uygulamak.
Ağaç türlerini kullanım alanları ve işlem maliyetleriyle karşılaştırmak.
Ağaç Kavramı
Ağaç (Tree)
- Doğrusal olmayan, hiyerarşik bir veri yapısıdır.
- Düğümler (node) ve onları bağlayan kenarlardan (edge) oluşur.
- En üstte tek bir kök (root) bulunur; ağaç kökten aşağı doğru ters çizilir.
- Kök dışındaki her düğümün tam bir ebeveyni vardır; bu yüzden döngü yoktur.
- Her düğümün sıfır veya daha fazla çocuğu olabilir.
Ağaç Kavramı
Günlük Hayatta Ağaçlar: Hiyerarşi
Ağaç Kavramı
Ağaç mı?
Bu yapı bir ağaç mıdır? 16 düğüm var; kenarları sayın ve döngü arayın.
Evet. Bağlantılı, döngüsüz ve 16 düğüme 15 kenar. Herhangi bir düğüm (ör. I) kök seçilip ağaç olarak çizilebilir.
Ağaç olmayanlar: döngü içeren, bir düğümü iki ebeveynli olan veya parçaları bağlantısız yapılar.
Ağaç Kavramı
Temel Unsurlar: Kök, İç Düğüm, Yaprak
Kök de (çocuğu varsa) bir iç düğümdür. Tek düğümlü ağaçta kök aynı zamanda yapraktır.
Ağaç Kavramı
Ağaç İlişkileri
| Terim | Anlamı (sağdaki ağaçta) |
|---|---|
| Ebeveyn (parent) | Hemen üstteki düğüm: D, H'nin ebeveyni |
| Çocuk (child) | Hemen alttaki düğüm: H, I, J → D'nin çocukları |
| Kardeş (sibling) | Ebeveyni aynı olanlar: H, I, J |
| Ata (ancestor) | Köke giden yoldaki düğümler: M'nin ataları H, D, A |
| Soy (descendant) | Alt ağaçtaki düğümler: D'nin soyu H, I, J, M |
Ağaç Kavramı
Terimler Ağaç Üzerinde
Kök: ebeveyni olmayan tek düğüm → A.
Ebeveyn / çocuk: D, H, I ve J'nin ebeveynidir; H, I, J de D'nin çocuklarıdır.
Kardeşler: H, I, J (ebeveynleri D). F ile G kardeş değildir.
Yapraklar: K, L, F, G, M, I, J (çocuksuz düğümler).
İç düğümler: A, B, C, D, E, H (en az bir çocuğu olanlar).
Atalar: M'nin ataları H, D, A. Tersine M; H, D ve A'nın soyundandır.
Derece (degree) = çocuk sayısı: A 3, B 2, C 1, D 3 … Ağacın derecesi = en büyük derece = 3.
Derinlik (depth): kökten düğüme kenar sayısı. E'nin derinliği 2 (A→B→E).
Yükseklik (height): kökten en uzak yaprağa kenar sayısı = 3 (A→B→E→K).
Alt ağaç (subtree): D ve tüm soyu (H, I, J, M) kendi başına bir ağaçtır.
Ağaç Kavramı
Derece, Derinlik, Yükseklik
| Ölçü | Tanım | Önceki ağaçta |
|---|---|---|
| Derece (degree) | Bir düğümün çocuk sayısı (alt ağaç sayısı) | D → 3 |
| Derinlik (depth) | Kökten o düğüme kadar olan yoldaki kenar sayısı; kökün derinliği 0 | E → 2 |
| Düzey (level) | Aynı derinlikteki düğümlerin kümesi | düzey 2: E … J |
| Düğüm yüksekliği | Düğümden altındaki en uzak yaprağa kenar sayısı; yaprağın yüksekliği 0 | D → 2 |
| Ağacın yüksekliği | Kökün yüksekliği = en büyük derinlik | 3 |
Ağaç Kavramı
Derinlik ve Yükseklik
| Düğüm | Yükseklik | Derinlik |
|---|---|---|
| A | 3 | 0 |
| B | 1 | 1 |
| C | 0 | 1 |
| D | 1 | 1 |
| E | 2 | 1 |
| F | 0 | 2 |
| G | 0 | 2 |
| H | 0 | 2 |
| I | 0 | 2 |
| J | 1 | 2 |
| K | 0 | 3 |
Ağaç Kavramı
Yol ve Alt Ağaç
- Yol (path): ardışık düğümleri kenarlarla bağlayan dizi.
p = (v₀, e₁, v₁, …, ek, vk) start(p) = v₀,end(p) = vk,length(p) = k(kenar sayısı).- Ağaçta iki düğüm arasında tam bir yol vardır (döngü olmadığı için).
- Alt ağaç (subtree): bir düğüm ve onun tüm soyu; kendisi de bir ağaçtır. Ör. bir klasör ve altındaki her şey.
Ağaç Kavramı
Temel Ağaç Türleri
| Tür | Özellik |
|---|---|
| Genel ağaç | Bir düğümün çocuk sayısına sınır yoktur. |
| k-lı ağaç (k-ary) | Her düğümün en fazla k çocuğu vardır. |
| İkili ağaç (binary) | Her düğümün en fazla iki çocuğu vardır: sol ve sağ. |
| İkili arama ağacı (BST) | İkili ağaç + her düğümde: sol alt ağaçtaki anahtarlar küçük, sağdakiler büyük. |
Dengeli arama ağaçları Bölüm 10'da; çok yollu ağaçlar bu bölümün sonunda ele alınır.
İkili Ağaçlar
İkili Ağaç (Binary Tree)
- Her düğümün en fazla iki çocuğu vardır: sol çocuk ve sağ çocuk.
- Çocukların yeri önemlidir: yalnızca sol çocuğu olan ağaç, yalnızca sağ çocuğu olandan farklıdır.
- Özyinelemeli tanım: İkili ağaç ya boştur ya da bir kök ile iki ikili ağaçtan (sol ve sağ alt ağaç) oluşur.
Soldaki zincir de geçerli bir ikili ağaçtır (çarpık / skewed ağaç): düğümler dengeli dağılmak zorunda değildir.
İkili Ağaçlar
Dolu, Tam ve Mükemmel
İkili Ağaçlar
Hangisi? Dolu mu, Tam mı, Mükemmel mi?
| Dolu (full) | evet |
| Tam (complete) | hayır |
| Mükemmel (perfect) | hayır |
Her düğümün 0 ya da 2 çocuğu var → dolu. Ama C'nin altı boşken en alt düzey E'nin altında → tam değil.
| Dolu (full) | hayır |
| Tam (complete) | evet |
| Mükemmel (perfect) | hayır |
Son düzey (8, 9, 10) soldan sağa boşluksuz → tam. 5'in tek çocuğu (10) var → dolu değil.
| Dolu (full) | hayır |
| Tam (complete) | hayır |
| Mükemmel (perfect) | hayır |
5'in tek çocuğu var → dolu değil. 10. konum boşken 11 dolu → tam değil. Ne tam ne dolu.
| Dolu (full) | evet |
| Tam (complete) | evet |
| Mükemmel (perfect) | evet |
Tüm iç düğümlerin 2 çocuğu var, tüm yapraklar aynı derinlikte → mükemmel (dolayısıyla dolu ve tam).
İkili Ağaçlar
İkili Ağaç Özellikleri
| Özellik | Formül | Örnek |
|---|---|---|
| d derinliğindeki en fazla düğüm | 2d | d = 3 → en fazla 8 düğüm |
| Yüksekliği h olan ağaçta en fazla düğüm | 2h+1 − 1 | h = 3 → 15 (mükemmel ağaç) |
| Yüksekliği h olan ağaçta en az düğüm | h + 1 | çarpık (zincir) ağaç |
| n düğümlü ağacın yüksekliği | ⌊log2 n⌋ ≤ h ≤ n − 1 | n = 15 → 3 ≤ h ≤ 14 |
| n düğümlü ağaçtaki kenar sayısı | n − 1 | her düğümün tek ebeveyni |
| Dolu ikili ağaçta yaprak sayısı | iç düğüm + 1 | 7 düğüm → 3 iç, 4 yaprak |
Gösterimler
Dizi Gösterimi
Düğümler düzey düzey, soldan sağa diziye yerleştirilir. Kök indis 1'de ise, indis i'deki düğüm için:
| 1 tabanlı | 0 tabanlı | |
|---|---|---|
| Sol çocuk | 2i | 2i + 1 |
| Sağ çocuk | 2i + 1 | 2i + 2 |
| Ebeveyn | ⌊i / 2⌋ | ⌊(i − 1) / 2⌋ |
Örnek: E (i = 5) → çocuklar 10 ve 11 (boş), ebeveyn ⌊5/2⌋ = 2 (B).
Referans tutulmaz; ebeveyn/çocuk erişimi O(1) aritmetikle yapılır. Tam ikili ağaçlar için idealdir (Bölüm 8: heap).
Gösterimler
Dizide Bellek İsrafı
- Çarpık ağaçta düğümlerin indisleri katlanarak büyür: 1, 2, 4, 8, 16.
- 5 düğüm için 16 hücre gerekir; 11 hücre boş kalır. Sağa çarpık olsaydı indisler 1, 3, 7, 15, 31 olurdu → 31 hücre.
- Genel olarak n düğümlü bir ağaç 2n − 1 hücreye kadar yer isteyebilir.
Dizi gösterimi
- Referans yok, hızlı indis hesabı
- Tam ağaçlarda boşluksuz
Ama
- Seyrek/çarpık ağaçta büyük israf
- Boyut sabit; büyütmek için kopyalama
Gösterimler
Bağlı Gösterim (Linked Representation)
- Her ağaç düğümü bir nesnedir: veri + sol ve sağ çocuk referansı.
- Çocuk yoksa referans
null'dır. - Boyut dinamiktir; yalnızca var olan düğümler için bellek ayrılır.
- Bir düğüme ulaşmak için kökten başlayıp referansları izlemek gerekir.
public class AgacDugumu { int veri; AgacDugumu sol; // sol çocuk (yoksa null) AgacDugumu sag; // sağ çocuk (yoksa null) public AgacDugumu(int veri) { this.veri = veri; // sol = sag = null } }
// 9 kökünde küçük bir ağaç kuralım AgacDugumu kok = new AgacDugumu(9); kok.sol = new AgacDugumu(2); kok.sag = new AgacDugumu(3); kok.sol.sol = new AgacDugumu(4);
Gösterimler
Bağlı Gösterim: Örnek
ebeveyn referansı da eklenir.Gösterimler
Dizi mi, Bağlı mı?
| Ölçüt | Dizi gösterimi | Bağlı gösterim |
|---|---|---|
| Bellek | Tam ağaçta en az; seyrek ağaçta 2n − 1'e kadar israf | Düğüm başına 2 ek referans; israf yok |
| Çocuk / ebeveyn erişimi | O(1), indis aritmetiğiyle | Çocuk O(1); ebeveyn için ek referans gerekir |
| i. düzeydeki k. düğüm | O(1): indis 2i + k − 1 (1 tabanlı, k ≥ 1) | Kökten gezinme gerekir |
| Büyüme | Dizi dolunca kopyalanarak büyütülür | Yeni düğüm eklemek O(1) (konum biliniyorsa) |
| Uygun olduğu yer | Tam ikili ağaçlar (heap) | Genel ve değişken şekilli ağaçlar (BST, ifade ağacı) |
Gösterimler
Genel Ağaç Gösterimi
Çocuk sayısı sınırsız olduğunda iki yaygın yol vardır:
// 1) Çocuk listesi class GenelDugum { int veri; List<GenelDugum> cocuklar = new ArrayList<>(); } // 2) İlk çocuk – sonraki kardeş class KardesDugum { int veri; KardesDugum ilkCocuk; KardesDugum sonrakiKardes; }
İkinci yolda her düğüm yine iki referans tutar: ilk çocuk (aşağı) ve sonraki kardeş (sağa). Böylece her genel ağaç bir ikili ağaç gibi saklanabilir.
Solda genel ağaç; sağda ilk çocuk (düz ok) – sonraki kardeş (kesikli ok) gösterimi.
Gezinmeler
Ağaç Gezinmeleri
| Gezinme | Sıra | Çıktı | Tipik kullanım |
|---|---|---|---|
| Kök başta (preorder) | kök → sol → sağ | 1 2 4 5 3 6 7 | Ağacı kopyalamak, önek ifade |
| Kök ortada (inorder) | sol → kök → sağ | 4 2 5 1 6 3 7 | BST'yi sıralı dolaşmak |
| Kök sonda (postorder) | sol → sağ → kök | 4 5 2 6 7 3 1 | Silme, boyut/yükseklik hesabı |
| Seviye sırası (level-order) | düzey düzey, soldan sağa | 1 2 3 4 5 6 7 | Düzey bazlı işlemler |
Gezinmeler
Kök Başta Gezinme (Preorder)
- Kökü ziyaret et.
- Sol alt ağacı kök başta gez.
- Sağ alt ağacı kök başta gez.
Kullanım: ağacı kopyalamak, düğümleri diziye yazmak, önek (prefix) ifade.
ziyaret(kok); kokBasta(kok.sol); kokBasta(kok.sag);
Kök 1 ziyaret edilir; sonra sol alt ağaca geçilir.
2 ziyaret edilir; sonra onun sol alt ağacı.
4 yaprak: ziyaret edilir, çocuğu yok.
2'nin sağ alt ağacı: 5.
Sol alt ağaç bitti; 1'in sağ alt ağacı: 3.
3'ün sol çocuğu 6.
3'ün sağ çocuğu 7. Çıktı: 1 2 4 5 3 6 7
Gezinmeler
Kök Ortada Gezinme (Inorder)
- Sol alt ağacı kök ortada gez.
- Kökü ziyaret et.
- Sağ alt ağacı kök ortada gez.
Kullanım: ikili arama ağacında anahtarları küçükten büyüğe sıralı vermek, ara ek (infix) ifade.
kokOrtada(kok.sol); ziyaret(kok); kokOrtada(kok.sag);
Kökten hep sola inilir; ilk ziyaret en soldaki düğüm: 4.
4'ün alt ağacı bitti → ebeveyni 2.
2'nin sağ alt ağacı: 5.
Sol alt ağaç tamamlandı → kök 1.
Sağ alt ağaçta yine en sola inilir: 6.
6'dan sonra ebeveyni 3.
Son olarak 7. Çıktı: 4 2 5 1 6 3 7
Gezinmeler
Kök Sonda Gezinme (Postorder)
- Sol alt ağacı kök sonda gez.
- Sağ alt ağacı kök sonda gez.
- Kökü ziyaret et.
Kullanım: ağacı silmek (önce çocuklar), boyut/yükseklik hesabı, sonek (postfix) ifade.
kokSonda(kok.sol); kokSonda(kok.sag); ziyaret(kok);
En soldaki yaprak 4 ilk ziyaret edilir.
Sonra 2'nin sağ çocuğu 5.
2'nin iki alt ağacı da bitti → 2.
1'in sağ alt ağacı: önce 6.
Sonra 7.
3'ün çocukları bitti → 3.
Kök en son ziyaret edilir: 1. Çıktı: 4 5 2 6 7 3 1
Gezinmeler
Seviye Sırası Gezinme (Level-order)
- Kökten başlar, her düzeyi soldan sağa tarar, sonra bir alt düzeye iner.
- Genişlik öncelikli aramanın (BFS) ağaçtaki hâlidir.
- Özyineleme yerine bir kuyruk (FIFO) kullanır: önce gelen düğümün çocukları önce işlenir.
Kullanım: düzey bazlı işlemler (her düzeyin toplamı, en yakın yaprak), ağacı düzey düzey yazdırmak.
Gezinmeler
Özyinelemeli Kök Başta ve Çağrı Yığını
1public void kokBasta(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 System.out.print(kok.veri + " ");6 kokBasta(kok.sol);7 kokBasta(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokBasta(9) | 5 |
kokBasta(9): kök null değil; 9 yazdırılır (satır 5).
1public void kokBasta(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 System.out.print(kok.veri + " ");6 kokBasta(kok.sol);7 kokBasta(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokBasta(2) | 5 |
| kokBasta(9) | 6 |
Satır 6: kokBasta(9.sol) = kokBasta(2) yığına eklenir; 2 yazdırılır.
1public void kokBasta(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 System.out.print(kok.veri + " ");6 kokBasta(kok.sol);7 kokBasta(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokBasta(4) | 5 |
| kokBasta(2) | 6 |
| kokBasta(9) | 6 |
kokBasta(4) çağrılır; 4 yazdırılır.
1public void kokBasta(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 System.out.print(kok.veri + " ");6 kokBasta(kok.sol);7 kokBasta(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokBasta(null) | 3 |
| kokBasta(4) | 6 |
| kokBasta(2) | 6 |
| kokBasta(9) | 6 |
kokBasta(4.sol) = kokBasta(null): satır 3'te hemen döner.
1public void kokBasta(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 System.out.print(kok.veri + " ");6 kokBasta(kok.sol);7 kokBasta(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokBasta(null) | 3 |
| kokBasta(4) | 7 |
| kokBasta(2) | 6 |
| kokBasta(9) | 6 |
Satır 7: 4.sag de null; döner. Ardından kokBasta(4) biter.
1public void kokBasta(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 System.out.print(kok.veri + " ");6 kokBasta(kok.sol);7 kokBasta(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokBasta(null) | 3 |
| kokBasta(2) | 7 |
| kokBasta(9) | 6 |
2'ye dönüldü; satır 7: kokBasta(2.sag) = null → döner. kokBasta(2) biter.
1public void kokBasta(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 System.out.print(kok.veri + " ");6 kokBasta(kok.sol);7 kokBasta(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokBasta(3) | 5 |
| kokBasta(9) | 7 |
9'a dönüldü; satır 7: kokBasta(3), 3 yazdırılır.
1public void kokBasta(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 System.out.print(kok.veri + " ");6 kokBasta(kok.sol);7 kokBasta(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokBasta(null) | 3 |
| kokBasta(3) | 7 |
| kokBasta(9) | 7 |
3'ün iki çocuğu da null; iki çağrı da hemen döner.
1public void kokBasta(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 System.out.print(kok.veri + " ");6 kokBasta(kok.sol);7 kokBasta(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| (boş) | |
kokBasta(3) ve kokBasta(9) biter; yığın boşalır. Çıktı: 9 2 4 3
Gezinmeler
Özyinelemeli Kök Ortada ve Çağrı Yığını
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(9) | 5 |
kokOrtada(9): önce sol alt ağaç (satır 5); 9 henüz yazdırılmaz.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(2) | 5 |
| kokOrtada(9) | 5 |
kokOrtada(2): yine önce sol alt ağaç.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(4) | 5 |
| kokOrtada(2) | 5 |
| kokOrtada(9) | 5 |
kokOrtada(4): sol alt ağaca inilir.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(null) | 3 |
| kokOrtada(4) | 5 |
| kokOrtada(2) | 5 |
| kokOrtada(9) | 5 |
4.sol null → çağrı hemen döner.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(4) | 6 |
| kokOrtada(2) | 5 |
| kokOrtada(9) | 5 |
Sol taraf bitti; 4 yazdırılır (satır 6).
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(null) | 3 |
| kokOrtada(4) | 7 |
| kokOrtada(2) | 5 |
| kokOrtada(9) | 5 |
4.sag null → döner; kokOrtada(4) biter.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(2) | 6 |
| kokOrtada(9) | 5 |
2'ye dönüldü; 2 yazdırılır.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(null) | 3 |
| kokOrtada(2) | 7 |
| kokOrtada(9) | 5 |
2.sag null → döner; kokOrtada(2) biter.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(9) | 6 |
9'a dönüldü; sol alt ağaç bitti, 9 yazdırılır.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(null) | 3 |
| kokOrtada(3) | 5 |
| kokOrtada(9) | 7 |
Satır 7: kokOrtada(3); 3.sol null → döner.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokOrtada(3) | 6 |
| kokOrtada(9) | 7 |
3 yazdırılır.
1public void kokOrtada(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokOrtada(kok.sol);6 System.out.print(kok.veri + " ");7 kokOrtada(kok.sag);8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| (boş) | |
3.sag null; kokOrtada(3) ve kokOrtada(9) biter. Çıktı: 4 2 9 3
Gezinmeler
Özyinelemeli Kök Sonda ve Çağrı Yığını
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(9) | 5 |
kokSonda(9): önce sol alt ağaç.
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(2) | 5 |
| kokSonda(9) | 5 |
kokSonda(2): önce sol alt ağaç.
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(4) | 5 |
| kokSonda(2) | 5 |
| kokSonda(9) | 5 |
kokSonda(4): önce sol alt ağaç.
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(null) | 3 |
| kokSonda(4) | 6 |
| kokSonda(2) | 5 |
| kokSonda(9) | 5 |
4'ün sol ve sağ çocuğu null: iki çağrı da hemen döner.
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(4) | 7 |
| kokSonda(2) | 5 |
| kokSonda(9) | 5 |
İki alt ağaç bitti; 4 yazdırılır (satır 7).
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(null) | 3 |
| kokSonda(2) | 6 |
| kokSonda(9) | 5 |
2'ye dönüldü; satır 6: 2.sag null → döner.
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(2) | 7 |
| kokSonda(9) | 5 |
2'nin iki alt ağacı bitti; 2 yazdırılır.
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(3) | 5 |
| kokSonda(9) | 6 |
9'a dönüldü; satır 6: kokSonda(3).
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(3) | 7 |
| kokSonda(9) | 6 |
3'ün iki çocuğu da null; ardından 3 yazdırılır.
1public void kokSonda(AgacDugumu kok) {2 if (kok == null) {3 return;4 }5 kokSonda(kok.sol);6 kokSonda(kok.sag);7 System.out.print(kok.veri + " ");8}
| Çağrı yığını (üst en üstte) | Satır |
|---|---|
| kokSonda(9) | 7 |
Kök en son: 9 yazdırılır, yığın boşalır. Çıktı: 4 2 3 9
Gezinmeler
Yığın ile Kök Başta Gezinme
public void kokBastaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); yigit.push(kok); while (!yigit.isEmpty()) { AgacDugumu gecici = yigit.pop(); System.out.print(gecici.veri + " "); if (gecici.sag != null) yigit.push(gecici.sag); // önce sağ if (gecici.sol != null) yigit.push(gecici.sol); // sol üstte }}
Kök yığına itilir: [1].
public void kokBastaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); yigit.push(kok); while (!yigit.isEmpty()) { AgacDugumu gecici = yigit.pop(); System.out.print(gecici.veri + " "); if (gecici.sag != null) yigit.push(gecici.sag); // önce sağ if (gecici.sol != null) yigit.push(gecici.sol); // sol üstte }}
1 çıkarılıp yazdırılır; önce sağ (3), sonra sol (2) itilir → 2 üstte.
public void kokBastaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); yigit.push(kok); while (!yigit.isEmpty()) { AgacDugumu gecici = yigit.pop(); System.out.print(gecici.veri + " "); if (gecici.sag != null) yigit.push(gecici.sag); // önce sağ if (gecici.sol != null) yigit.push(gecici.sol); // sol üstte }}
2 çıkarılır, yazdırılır; 5 ve 4 itilir.
public void kokBastaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); yigit.push(kok); while (!yigit.isEmpty()) { AgacDugumu gecici = yigit.pop(); System.out.print(gecici.veri + " "); if (gecici.sag != null) yigit.push(gecici.sag); // önce sağ if (gecici.sol != null) yigit.push(gecici.sol); // sol üstte }}
4 çıkarılır, yazdırılır; çocuğu yok.
public void kokBastaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); yigit.push(kok); while (!yigit.isEmpty()) { AgacDugumu gecici = yigit.pop(); System.out.print(gecici.veri + " "); if (gecici.sag != null) yigit.push(gecici.sag); // önce sağ if (gecici.sol != null) yigit.push(gecici.sol); // sol üstte }}
5 çıkarılır, yazdırılır.
public void kokBastaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); yigit.push(kok); while (!yigit.isEmpty()) { AgacDugumu gecici = yigit.pop(); System.out.print(gecici.veri + " "); if (gecici.sag != null) yigit.push(gecici.sag); // önce sağ if (gecici.sol != null) yigit.push(gecici.sol); // sol üstte }}
3 çıkarılır, yazdırılır; 7 ve 6 itilir.
public void kokBastaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); yigit.push(kok); while (!yigit.isEmpty()) { AgacDugumu gecici = yigit.pop(); System.out.print(gecici.veri + " "); if (gecici.sag != null) yigit.push(gecici.sag); // önce sağ if (gecici.sol != null) yigit.push(gecici.sol); // sol üstte }}
6 çıkarılır, yazdırılır.
public void kokBastaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); yigit.push(kok); while (!yigit.isEmpty()) { AgacDugumu gecici = yigit.pop(); System.out.print(gecici.veri + " "); if (gecici.sag != null) yigit.push(gecici.sag); // önce sağ if (gecici.sol != null) yigit.push(gecici.sol); // sol üstte }}
7 yazdırılır; yığın boş, döngü biter. Çıktı: 1 2 4 5 3 6 7
Gezinmeler
Yığın ile Kök Ortada Gezinme
public void kokOrtadaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); AgacDugumu gecici = kok; while (!yigit.isEmpty() || gecici != null) { if (gecici != null) { yigit.push(gecici); gecici = gecici.sol; } else { gecici = yigit.pop(); System.out.print(gecici.veri + " "); gecici = gecici.sag; } }}
gecici null olana kadar sola inilir: 1, 2, 4 itilir; gecici = 4.sol = null.
public void kokOrtadaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); AgacDugumu gecici = kok; while (!yigit.isEmpty() || gecici != null) { if (gecici != null) { yigit.push(gecici); gecici = gecici.sol; } else { gecici = yigit.pop(); System.out.print(gecici.veri + " "); gecici = gecici.sag; } }}
4 çıkarılır, yazdırılır; gecici = 4.sag = null.
public void kokOrtadaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); AgacDugumu gecici = kok; while (!yigit.isEmpty() || gecici != null) { if (gecici != null) { yigit.push(gecici); gecici = gecici.sol; } else { gecici = yigit.pop(); System.out.print(gecici.veri + " "); gecici = gecici.sag; } }}
2 çıkarılır, yazdırılır; gecici = 5 → 5 itilir, gecici = null.
public void kokOrtadaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); AgacDugumu gecici = kok; while (!yigit.isEmpty() || gecici != null) { if (gecici != null) { yigit.push(gecici); gecici = gecici.sol; } else { gecici = yigit.pop(); System.out.print(gecici.veri + " "); gecici = gecici.sag; } }}
5 çıkarılır, yazdırılır; gecici = null.
public void kokOrtadaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); AgacDugumu gecici = kok; while (!yigit.isEmpty() || gecici != null) { if (gecici != null) { yigit.push(gecici); gecici = gecici.sol; } else { gecici = yigit.pop(); System.out.print(gecici.veri + " "); gecici = gecici.sag; } }}
1 çıkarılır, yazdırılır; gecici = 3 → 3 ve 6 itilir.
public void kokOrtadaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); AgacDugumu gecici = kok; while (!yigit.isEmpty() || gecici != null) { if (gecici != null) { yigit.push(gecici); gecici = gecici.sol; } else { gecici = yigit.pop(); System.out.print(gecici.veri + " "); gecici = gecici.sag; } }}
6 çıkarılır, yazdırılır; gecici = null.
public void kokOrtadaYigin(AgacDugumu kok) { if (kok == null) return; Stack<AgacDugumu> yigit = new Stack<>(); AgacDugumu gecici = kok; while (!yigit.isEmpty() || gecici != null) { if (gecici != null) { yigit.push(gecici); gecici = gecici.sol; } else { gecici = yigit.pop(); System.out.print(gecici.veri + " "); gecici = gecici.sag; } }}
3 yazdırılır; gecici = null ve yığın boş → biter. Çıktı: 4 2 5 1 6 3
Gezinmeler
Yığın ile Kök Sonda Gezinme: Kod
public void kokSondaYigin(AgacDugumu kok) { AgacDugumu simdiki = kok; Stack<AgacDugumu> yigit = new Stack<>(); while (simdiki != null || !yigit.isEmpty()) { if (simdiki != null) { yigit.push(simdiki); simdiki = simdiki.sol; } else { AgacDugumu gecici = yigit.peek().sag; if (gecici == null) { gecici = yigit.pop(); System.out.print(gecici.veri + " "); while (!yigit.isEmpty() && gecici == yigit.peek().sag) { gecici = yigit.pop(); System.out.print(gecici.veri + " "); } } else { simdiki = gecici; } } } }
- Kök, iki alt ağacı da bittikten sonra yazdırılmalı; bu yüzden yığındaki düğüm hemen çıkarılmaz, önce
peekile bakılır. - Üstteki düğümün sağ çocuğu varsa önce o alt ağaca gidilir.
- Sağ çocuk yoksa düğüm yazdırılır. Az önce yazdırılan düğüm, yığındakinin sağ çocuğuysa o ebeveynin de işi bitmiştir → o da çıkarılıp yazdırılır.
Gezinmeler
Yığın ile Kök Sonda Gezinme: İzleme
Gezinmeler
Kuyruk ile Seviye Sırası Gezinme
public void seviyeSirasi(AgacDugumu kok) { if (kok == null) return; Queue<AgacDugumu> kuyruk = new LinkedList<>(); kuyruk.add(kok); while (!kuyruk.isEmpty()) { AgacDugumu gecici = kuyruk.poll(); System.out.print(gecici.veri + " "); if (gecici.sol != null) kuyruk.add(gecici.sol); if (gecici.sag != null) kuyruk.add(gecici.sag); }}
Kök kuyruğa eklenir: [4].
public void seviyeSirasi(AgacDugumu kok) { if (kok == null) return; Queue<AgacDugumu> kuyruk = new LinkedList<>(); kuyruk.add(kok); while (!kuyruk.isEmpty()) { AgacDugumu gecici = kuyruk.poll(); System.out.print(gecici.veri + " "); if (gecici.sol != null) kuyruk.add(gecici.sol); if (gecici.sag != null) kuyruk.add(gecici.sag); }}
4 kuyruğun önünden alınır, yazdırılır; çocukları 3 ve 7 arkaya eklenir.
public void seviyeSirasi(AgacDugumu kok) { if (kok == null) return; Queue<AgacDugumu> kuyruk = new LinkedList<>(); kuyruk.add(kok); while (!kuyruk.isEmpty()) { AgacDugumu gecici = kuyruk.poll(); System.out.print(gecici.veri + " "); if (gecici.sol != null) kuyruk.add(gecici.sol); if (gecici.sag != null) kuyruk.add(gecici.sag); }}
3 alınır, yazdırılır; 5 ve 8 arkaya eklenir.
public void seviyeSirasi(AgacDugumu kok) { if (kok == null) return; Queue<AgacDugumu> kuyruk = new LinkedList<>(); kuyruk.add(kok); while (!kuyruk.isEmpty()) { AgacDugumu gecici = kuyruk.poll(); System.out.print(gecici.veri + " "); if (gecici.sol != null) kuyruk.add(gecici.sol); if (gecici.sag != null) kuyruk.add(gecici.sag); }}
7 alınır, yazdırılır; çocuğu yok.
public void seviyeSirasi(AgacDugumu kok) { if (kok == null) return; Queue<AgacDugumu> kuyruk = new LinkedList<>(); kuyruk.add(kok); while (!kuyruk.isEmpty()) { AgacDugumu gecici = kuyruk.poll(); System.out.print(gecici.veri + " "); if (gecici.sol != null) kuyruk.add(gecici.sol); if (gecici.sag != null) kuyruk.add(gecici.sag); }}
5 alınır, yazdırılır.
public void seviyeSirasi(AgacDugumu kok) { if (kok == null) return; Queue<AgacDugumu> kuyruk = new LinkedList<>(); kuyruk.add(kok); while (!kuyruk.isEmpty()) { AgacDugumu gecici = kuyruk.poll(); System.out.print(gecici.veri + " "); if (gecici.sol != null) kuyruk.add(gecici.sol); if (gecici.sag != null) kuyruk.add(gecici.sag); }}
8 yazdırılır; kuyruk boş. Çıktı: 4 3 7 5 8 (kök başta olsaydı: 4 3 5 8 7)
Gezinmeler
Uygulama: İfade Ağacı
- İç düğümler işleçler, yapraklar işlenenlerdir.
- Aynı ağaç, gezinme türüne göre farklı gösterimler verir.
- Değer, kök sonda gezinmeyle hesaplanır: önce iki alt ağacın değeri, sonra işleç.
| Gezinme | Çıktı | Gösterim |
|---|---|---|
| Kök başta | × + 3 4 − 5 2 | önek (prefix) |
| Kök ortada | 3 + 4 × 5 − 2 → parantezle: (3 + 4) × (5 − 2) | ara ek (infix) |
| Kök sonda | 3 4 + 5 2 − × → 7 × 3 = 21 | sonek (postfix) |
Kök ortada çıktısında parantez kaybolur; ifadeyi doğru yazmak için her alt ağaç parantez içine alınmalıdır. Bkz. Bölüm 4 infix → postfix simülatörü.
Gezinmeler
İkili Ağaçta En Büyük Değeri Bulma
1public int enBuyukBul(AgacDugumu kok) {2 if (kok == null) {3 return Integer.MIN_VALUE;4 }5 int sonuc = kok.veri;6 int sol = enBuyukBul(kok.sol);7 int sag = enBuyukBul(kok.sag);8 if (sol > sonuc)9 sonuc = sol;10 if (sag > sonuc)11 sonuc = sag;12 return sonuc;13}
enBuyukBul(4): sonuc = 4; önce sol alt ağaç (3) çağrılır.
1public int enBuyukBul(AgacDugumu kok) {2 if (kok == null) {3 return Integer.MIN_VALUE;4 }5 int sonuc = kok.veri;6 int sol = enBuyukBul(kok.sol);7 int sag = enBuyukBul(kok.sag);8 if (sol > sonuc)9 sonuc = sol;10 if (sag > sonuc)11 sonuc = sag;12 return sonuc;13}
5 yaprak: iki çocuğu MIN_VALUE döndürür → 5 döner.
1public int enBuyukBul(AgacDugumu kok) {2 if (kok == null) {3 return Integer.MIN_VALUE;4 }5 int sonuc = kok.veri;6 int sol = enBuyukBul(kok.sol);7 int sag = enBuyukBul(kok.sag);8 if (sol > sonuc)9 sonuc = sol;10 if (sag > sonuc)11 sonuc = sag;12 return sonuc;13}
8 yaprak → 8 döner.
1public int enBuyukBul(AgacDugumu kok) {2 if (kok == null) {3 return Integer.MIN_VALUE;4 }5 int sonuc = kok.veri;6 int sol = enBuyukBul(kok.sol);7 int sag = enBuyukBul(kok.sag);8 if (sol > sonuc)9 sonuc = sol;10 if (sag > sonuc)11 sonuc = sag;12 return sonuc;13}
Düğüm 3: sonuc = 3; sol = 5 > 3 → 5; sag = 8 > 5 → 8 döner.
1public int enBuyukBul(AgacDugumu kok) {2 if (kok == null) {3 return Integer.MIN_VALUE;4 }5 int sonuc = kok.veri;6 int sol = enBuyukBul(kok.sol);7 int sag = enBuyukBul(kok.sag);8 if (sol > sonuc)9 sonuc = sol;10 if (sag > sonuc)11 sonuc = sag;12 return sonuc;13}
7 yaprak → 7 döner.
1public int enBuyukBul(AgacDugumu kok) {2 if (kok == null) {3 return Integer.MIN_VALUE;4 }5 int sonuc = kok.veri;6 int sol = enBuyukBul(kok.sol);7 int sag = enBuyukBul(kok.sag);8 if (sol > sonuc)9 sonuc = sol;10 if (sag > sonuc)11 sonuc = sag;12 return sonuc;13}
Kök: sonuc = 4; sol = 8 → 8; sag = 7 < 8. Sonuç: 8
Gezinmeler
Özyinelemeli Ağaç Fonksiyonları
int boyut(AgacDugumu k) { // düğüm sayısı if (k == null) return 0; return 1 + boyut(k.sol) + boyut(k.sag); } int yukseklik(AgacDugumu k) { // kenar sayısı if (k == null) return -1; // boş ağaç: -1 return 1 + Math.max(yukseklik(k.sol), yukseklik(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); }
Gezinmeler
Gezinmelerin Maliyeti
| Yöntem | Zaman | Ek bellek | Neden? |
|---|---|---|---|
| Özyinelemeli pre/in/post | O(n) | O(h) | Çağrı yığınında en fazla h + 1 çerçeve |
| Yığın ile pre/in/post | O(n) | O(h) | Açık yığın, özyinelemenin yerini tutar |
| Kuyruk ile seviye sırası | O(n) | O(w) | w: en geniş düzeydeki düğüm sayısı |
StackOverflowError verebilir → yığınlı sürüm tercih edilir.Çok Yollu Ağaçlar
B-Ağacı (B-Tree)
- Bir düğümde birden çok anahtar ve çok sayıda çocuk bulunan, dengeli bir çok yollu arama ağacıdır.
- Derecesi m olan B-ağacında bir düğüm en fazla m çocuk, m − 1 anahtar tutar; kök dışındaki düğümlerde en az ⌈m/2⌉ çocuk bulunur.
- Düğüm içindeki anahtarlar sıralıdır; tüm yapraklar aynı derinliktedir.
- Yükseklik O(log n) kalır; ekleme/silmede düğümler bölünür veya birleştirilir.
B-ağacı, (a,b) ağacının özel bir hâlidir. Adım adım ekleme ve bölünme için: B-Ağacı simülatörü.
Çok Yollu Ağaçlar
B+ Ağacı (B+ Tree)
Çoğu ilişkisel veritabanı indeksi B+ ağacıdır. Deneyin: B+ Ağacı simülatörü.
Özet
Özet
| Konu | Hatırlanacaklar |
|---|---|
| Terimler | kök, ebeveyn/çocuk, yaprak, iç düğüm; n düğüm → n − 1 kenar |
| Ölçüler | derece = çocuk sayısı; derinlik = kökten kenar sayısı; yükseklik = en uzun aşağı yol |
| İkili ağaç | dolu: 0/2 çocuk · tam: son düzey soldan dolar · mükemmel: tüm düzeyler dolu |
| Gösterim | dizi: indeks bağıntıları · bağlı: sol/sağ başvuruları |
| Gezinme | kök başta K-S-S · kök ortada S-K-S · kök sonda S-S-K · seviye sırası kuyrukla |
| Maliyet | tüm gezinmeler O(n); ek bellek O(h) (yığın) veya O(w) (kuyruk) |
| B / B+ ağacı | çok yollu, dengeli, yapraklar aynı derinlikte; disk tabanlı indeksler |
Özet
Etkileşimli Simülatörler
Özet
Örnek Problemler
- Sağdaki ağacın kök başta, kök ortada, kök sonda ve seviye sırası çıktılarını yazın.
- Ağacın yüksekliği nedir? Yapraklar hangileri? E'nin derinliği kaçtır?
- Bu ağaç dolu mu, tam mı, mükemmel mi?
- 1 tabanlı dizi gösteriminde F ve G hangi indislerde durur? Dizi en az kaç hücre olmalı?
- Yüksekliği 4 olan bir ikili ağaçta en fazla kaç düğüm olabilir?
- Kök başta: A B D E C F, kök ortada: D B E A C F. Ağacı çizin.
Cevapları göster
- Kök başta: A B D E G C F · kök ortada: D B G E A C F · kök sonda: D G E B F C A · seviye: A B C D E F G
- Yükseklik 3 (A→B→E→G); yapraklar D, G, F; E'nin derinliği 2.
- Hiçbiri: E ve C'nin tek çocuğu var (dolu değil); 6. konum boşken 7 dolu (tam değil).
- F: C'nin sağ çocuğu → 2·3 + 1 = 7; G: E'nin sol çocuğu → 2·5 = 10. En az 10 hücre (1..10).
- 25 − 1 = 31.
- A kök; sol alt ağaç {D, B, E}: B kök, D sol, E sağ; sağ alt ağaç {C, F}: C kök, F sağ çocuk.
Özet
Kaynaklar
- Goodrich, Tamassia ve Goldwasser, Data Structures and Algorithms in Java, 6. baskı, 2014.
- Cormen, Leiserson, Rivest ve Stein, Introduction to Algorithms, 4. baskı, 2022.
- Sedgewick ve Wayne, Algorithms, 4. baskı, 2011.
Son
← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt