Bölüm 7: Ağaçlar
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
Terminoloji ve İkili ağaç
Kök, baba, çocuk, kardeş, yaprak, düzey ve yükseklik kavramlarını ayırmak.
Yaprak düğüm nedir?
Giriş
Öğrenme Çıktıları
Kök, baba, çocuk, kardeş, yaprak, düzey ve yükseklik kavramlarını ayırmak.
Tam ağacı diziyle, genel ağacı bağlaçlarla göstermek.
Kök önde, kök ortada ve kök sonda sıralarını üretmek.
Dolaşımın zaman ve çağrı yığını maliyetini hesaplamak.
Temel Kavramlar
Ağaç hiyerarşik ilişkileri temsil eder
Kök dışındaki her düğümün tek bir babası vardır; alt ağaçlar aynı yapının daha küçük örnekleridir.
Babası olmayan başlangıç düğümü.
Çocuğu olmayan düğüm.
Kökten düğüme kadar kenar sayısı.
Düğümden en uzak yaprağa kadar kenar sayısı.
Temel Kavramlar
Kavram Haritası
Gösterim
İkili ağaçta her düğümün en çok iki çocuğu vardır
Preorder: A B D E C F G · Inorder: D B E A F C G · Postorder: D E B F G C A
C ile Gerçekleştirim
Bağlaçlı ikili ağaç düğümü
typedef struct AgacDugumu {
int veri;
struct AgacDugumu *sol;
struct AgacDugumu *sag;
} AgacDugumu;C ile Gerçekleştirim
C'de Bellek ve Sahiplik
Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.
Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.
Boyut, kapasite ve geçerli indisleri her işlemde koru.
NULL, boş yapı ve tek öğe durumlarını özellikle null kök durumunu atlamak riskiyle birlikte test et.
Temel İşlemler
Kök ortada dolaşım
void inorder(const AgacDugumu *kok) {
if (kok == NULL) return;
inorder(kok->sol);
printf("%d ", kok->veri);
inorder(kok->sag);
}Temel İşlemler
Kodu Okurken
Yaprak düğüm nedir?
Her adımda kök kuralı korunuyor mu?
Tam ağacı diziyle, genel ağacı bağlaçlarla göstermek.
Derinlik ile yüksekliği aynı sanmak
Adım Adım
Inorder dolaşım: D B E A F C G
A → B → D. D'nin sol çocuğu NULL.
D yazılır; geri dönülür; B yazılır.
E alt ağacı işlenir; sonra A yazılır.
C'nin solunda F, kökte C, sağında G yazılır.
Sınıf Notu
Dersten Sesler
“Bir halterciyi yüz kere seyretsem, yine de o halteri kaldıramam. 'Bu nasıl yazıldı?' sorusuna yoğunlaşın.”
“'Çok güzel çalışıyor da geri dönmüyor; çağırıyorum, çağırıyorum, tıkanıp kalıyor.' O zaman taban durumuna yeniden bakacağız.”
Notlardaki sınıf içi anlatımdan, yazım ve uzunluk bakımından sunuma uyarlanmıştır.
Analiz
Karmaşıklık Özeti
| İşlem | Zaman | Ek bellek |
|---|---|---|
| Tüm ağacı dolaşma | O(n) | O(h) |
| Düğüm sayma | O(n) | O(h) |
| Yükseklik bulma | O(n) | O(h) |
| Tam ağaçta dizi erişimi | O(1) | O(n) |
| Düzey düzey dolaşım | O(n) | O(w) |
n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı
Tasarım Kararı
Hangi Durumda Hangisi?
Ağaç tam veya tama yakınsa; heap gibi.
Şekil düzensiz ve ekleme/silme varsa.
Kod açıklığı önemli ve yükseklik güvenliyse.
Çağrı derinliği denetlenmek veya özel durum saklanmak isteniyorsa.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Yaprak düğüm nedir?
- Tam ikili ağacın dizi gösterimi neden verimlidir?
- Inorder dolaşımın işlem sırası nedir?
- Düzey düzey dolaşım hangi yardımcı yapıyı kullanır?
- Dolaşımın zaman maliyeti neden O(n)'dir?
Cevapları göster
- Çocuğu olmayan düğüm.
- İndisler arasında boşluk azdır ve çocuk adresleri formülle bulunur.
- sol alt ağaç, kök, sağ alt ağaç.
- Kuyruk.
- Her düğüm sabit sayıda kez ziyaret edilir.
Uygulama
Mini Laboratuvar
Yaprak düğüm nedir?
Inorder dolaşımın işlem sırası nedir?
Dolaşımın zaman maliyeti neden O(n)'dir?
Özet
Bölüm Özeti
Her alt ağaç yine bir ağaçtır.
Kökün işlem sırası sonucu belirler.
Ek bellek ve arama performansı h ile ilişkilidir.
Özet
Kaynaklar ve Devam
- Veri Yapıları ve Algoritmalar 2, PDF s. 7-27
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.