CEN207 Veri Yapıları · Hafta 4

Ağaçlar, Öbekler ve Huffman Kodlaması

CEN207 Veri Yapıları — Hafta 4

Dr. Öğr. Üyesi Uğur CORUH · 2026-2027 Güz

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Bugünün planı (3 saat)

Saat Konu
1 Ağaçlar, terimler, biçimler Anim 1–2 · dolaşmalar: pre/in/post/yinelemesiz/level Anim 3–7
2 Dizi gösterimi Anim 8 · ikili öbek: ekleme/çıkarma/kurma/sıralama Anim 9–12
3 Öncelik kuyruğu Anim 13 · varyasyonlar Anim 14–16 · Huffman Anim 17–18

Öğrenme çıktıları: ÖÇ.1 (temel veri yapılarını açıklama) · ÖÇ.2 (karmaşıklık analizi) · ÖÇ.7 (doğru yapıyı seçme)

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Bu haftanın kavramları — nerede

Kavram Nerede
Ağaç terimleri, ikili ağaç biçimleri Bölüm 1–2
Dolaşmalar (pre/in/post/yinelemesiz/level) Bölüm 3
Ağacın dizi gösterimi Bölüm 4
İkili öbek, öbek sıralaması Bölüm 5
Öncelik kuyruğu, varyasyonlar, Huffman Bölüm 6–8
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod örnekleri nasıl çalışıyor

  • Her fikrin eksiksiz bir C ve Java programı var
  • C: gcc -std=c11 -Wall -Wextra -o /tmp/x file.c && /tmp/x
  • Java: javac -d /tmp/j File.java && java -cp /tmp/j File
  • Kaynaklar: code/week-04/c/ ve code/week-04/java/
  • Her programın beklenen çıktısı hafta notlarında var
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Tekrar — Hafta 1–2: işaretçiler ve listeler

  • malloc/free: bir kutu, bir sahip, boşken NULL
  • Bağlı liste düğümü: bir değer + bir next işaretçisi
  • Ağaç düğümü: bir değer + iki işaretçi, left/right
  • Liste NULLde biter; ağaçta ikisi de NULL olan yapraktır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Tekrar — Hafta 3: yığın, kuyruk, özyineleme

  • Özyineleme yığının ta kendisi: çağrı push, dönüş pop
  • Bugün: aynı dolaşma, kendi yığınımızla, elle
  • Kuyruk (FIFO) değişmeden geri dönüyor, level order için
  • Hafta 3'ün yapıları artık düğüm tutuyor, sayı değil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Haftanın haritası — bir bakışta

Ağaçlar ve dolaşmalar Öbekler ve Huffman
Terimler, beş biçim İkili öbek, öbek sıralaması
Beş dolaşma sırası Öncelik kuyruğu, varyasyonlar
Dizi gösterimi Huffman kodlaması
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

1. Neden Ağaç? Terimler ve Tarihçe

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Başlangıç sorusu

Bir dosya yöneticisi: bir ana klasör, klasörlerin
içinde klasörler, onların içinde dosyalar. Bir
kök, sınırsız dallanma, ve hiçbir klasör kendi
atası olamıyor.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kısa bir tarihçe

  • 1857 — Cayley, molekülleri sayarken ağaçları da sayıyor
  • 1968 — Knuth, terimleri TAOCP Cilt 1'de sabitliyor
  • Kök, yaprak, derece, seviye, yükseklik — hâlâ onun terimleri
  • Matematiğin en eski biçimlerinden biri, bilgisayara ödünç
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sezgi — baş aşağı bir ağaç

  • Kök gövdedir — en üste çizilir
  • Her şey kökten aşağıya dallanır
  • Yaprakın çocuğu yoktur — bir dalın sonu
  • Evet baş aşağı: bilgisayar bilimi hep böyle çizer
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Terimler (1/3)

Terim Anlamı
Kök (root) Ebeveyni olmayan tek düğüm
Ebeveyn / çocuk Adan Bye kenar varsa, A ebeveyn, B çocuk
Kardeş (sibling) Aynı ebeveyni paylaşan iki düğüm
Yaprak (leaf) Çocuğu olmayan düğüm — derece 0
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Terimler (2/3)

Terim Anlamı
İç düğüm En az bir çocuğu olan düğüm
Kenar (edge) Ebeveyn-çocuk bağı; n düğüm, n−1 kenar
Derece (degree) Bir düğümün çocuk sayısı
Derinlik (depth) Kökten o düğüme inen kenar sayısı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Terimler (3/3)

Terim Anlamı
Yükseklik (height, düğüm) En derin yaprağa inen en uzun yol
Yükseklik (height, ağaç) Kökün yüksekliği
Altağaç (subtree) Bir düğüm + altındaki her şey
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Ağaç terimleri, tek tek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — yıldız: kökün 10 çocuğu var

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — ağaç düğümü

typedef struct Node {
    char label[4];
    struct Node *children[MAX_CHILDREN];
    int child_count;   /* bu düğümün derecesi */
    int depth;
    struct Node *parent;
} Node;
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — height() (aşağıdan yukarı, özyinelemeli)

int height(Node *n) {
    if (n->child_count == 0)
        return 0;         /* yaprak: yükseklik 0 */
    int best = -1;
    for (int i = 0; i < n->child_count; i++) {
        int h = height(n->children[i]);
        if (h > best) best = h;
    }
    return best + 1;      /* 1 + en yüksek çocuk */
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — compute_depths() (yukarıdan aşağı, BFS)

void compute_depths(Node *root) {
    Node *queue[MAX_NODES];
    int front = 0, rear = 0;
    root->depth = 0;
    queue[rear++] = root;
    while (front < rear) {
        Node *cur = queue[front++];
        for (int i = 0; i < cur->child_count; i++) {
            Node *ch = cur->children[i];
            ch->depth = cur->depth + 1;
            queue[rear++] = ch;
        }
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • height: her düğüm bir kez ziyaret edilir — O(n)
  • compute_depths: her düğüm bir kez ziyaret edilir — O(n)
  • İkisi de ağacın biçimine bağlı değil
  • İnce bir zincir, dallı bir ağaçla aynı n için aynı maliyette
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • Derinliki (kökten aşağı) yükseklikle (yaprağa kadar) karıştırmak
  • Bir yaprağın yüksekliğinin 0, 1 değil, olduğunu unutmak
  • Her ağacın ikili olduğunu sanmak — genel bir düğümün istediği kadar çocuğu olabilir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

18 düğümlü örnekte, Q1nin çocukları S1
ve S2. Q1nin derecesi nedir? Q1nin
derinliği 1 ise, S1in derinliği nedir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

Q1nin derecesi 2dir (iki çocuğu var).
S1, Q1nin çocuğu olduğu için derinliği
Q1nin derinliği + 1 = 2dir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

2. İkili Ağaçlar: Biçimler ve Düğüm Sayıları

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Başlangıç sorusu

Her düğümü en çok iki çocukla, left ve
right, sınırlayın. "İstediği kadar çocuk"tan
vazgeçmek neden değerli olsun?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — ikili ağaç düğümü

typedef struct Node {
    int value;
    struct Node *left, *right;
} Node;
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Beş biçim, kesin tanımlarıyla

Biçim Tanım
Dolu (full) Her düğümün 0 ya da 2 çocuğu var
Tam (complete) Son seviye hariç her seviye dolu, soldan sağa
Mükemmel (perfect) Dolu ve her yaprak aynı derinlikte
Dejenere (degenerate) Her düğümün 0 ya da 1 çocuğu — bir zincir
Dengeli (balanced) Sol/sağ altağaç yükseklikleri ≤ 1 fark
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

İkili ağaç biçimleri, tek tek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — dejenere bir zincir, 10 düğüm

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kaç düğüm sığar?

  • Yükseklik h'de en çok: mükemmel ağaçta 2h+1 − 1 düğüm
  • Seviye k, 2k düğüm tutar; h'ye kadar toplayın
  • n düğüm için en az yükseklik: ⌊log₂ n⌋, hiçbir dizilim daha iyisini yapamaz
  • Her seviye, üstündekinin en çok iki katı düğüm tutar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Denge neden önemli

  • Dengeli bir ağaç yüksekliği log₂ n'e yakın tutar
  • Kökten yapraga işlemler o zaman O(log n) maliyetli
  • Dejenere bir ağacın yüksekliği n − 1, bir listeden farksız
  • Aynı düğüm sayısı, çok farklı maliyet — biçim belirler
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — is_complete (boşlukları yakalamak)

static bool is_complete(Node *root) {
    Node *queue[MAX_NODES]; int front = 0, rear = 0;
    queue[rear++] = root;
    bool seen_gap = false;
    while (front < rear) {
        Node *n = queue[front++];
        if (n == NULL) { seen_gap = true; continue; }
        if (seen_gap) return false;
        queue[rear++] = n->left;
        queue[rear++] = n->right;
    }
    return true;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — check_balance (iki değil bir geçiş)

static int check_balance(Node *n) {
    if (n == NULL) return 0;
    int hl = check_balance(n->left);
    if (hl == -1) return -1;
    int hr = check_balance(n->right);
    if (hr == -1) return -1;
    if (abs(hl - hr) > 1) return -1;
    return 1 + (hl > hr ? hl : hr);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • Beş biçim kontrolünün hepsi O(n) — her düğüm bir kez
  • is_complete, kuyruğu için O(n) ekstra alana ihtiyaç duyar
  • Diğer dördü yalnızca O(h) özyineleme yığını alanı ister
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • "Tam"ın her seviyenin dolu olması demek olduğunu sanmak
  • Mükemmeli (tam + tüm yapraklar aynı derinlikte) tam ile karıştırmak
  • height()i düğüm başına iki kez çağırmak — O(n)'i O(n²)'ye çevirir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

İkili bir ağacın yüksekliği 3 ve mükemmel.
Kaç düğümü var? Kaçı yaprak?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

24 − 1 = 15 düğüm. Son seviye
(seviye 3) 23 = 8 yaprak tutar;
diğer 7 düğüm iç düğümdür.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

3. Dolaşmalar: Her Düğümü Bir Kez Ziyaret Etmek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Tek bir "doğal" sıra yok

  • Bir düğümün (en çok) iki çocuğu var — gerçek bir seçim
  • Üç özyinelemeli sıra: preorder, inorder, postorder
  • Özyinelemesiz iki sıra daha: kendi yığınımız, ve bir kuyruk
  • Aynı ağaç, beş sıra, genelde beş farklı sonuç
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Preorder: ziyaret, sol, sağ

Düğümü çocuklarından önce ziyaret edin.
Kök her zaman ilk ziyaret edilir — tam
olarak bir ağacı sıfırdan kurmak için gereken sıra.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Preorder, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — sola yığılmış bir zincir

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — preorder (özyinelemeli)

static void preorder(Node *node) {
    if (node == NULL) return;
    printf("visit %d\n", node->value);
    visited[visited_count++] = node->value;
    preorder(node->left);
    preorder(node->right);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Inorder: sol, ziyaret, sağ

Düğümü çocukları arasında ziyaret edin.
Bir ikili arama ağacında bu, her değeri
sıralı ziyaret eder — burada önizlendi, ileride kurulacak.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Inorder, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — sağa yığılmış bir zincir

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — inorder (özyinelemeli)

static void inorder(Node *node) {
    if (node == NULL) return;
    inorder(node->left);
    printf("visit %d\n", node->value);
    visited[visited_count++] = node->value;
    inorder(node->right);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Postorder: sol, sağ, ziyaret

Düğümü her iki çocuktan sonra ziyaret edin.
Kök her zaman en son ziyaret edilir — tam
olarak bir ağacı güvenle silmek için gereken sıra.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Postorder, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — sağa yığılmış zincir, tersten

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — postorder (özyinelemeli)

static void postorder(Node *node) {
    if (node == NULL) return;
    postorder(node->left);
    postorder(node->right);
    printf("visit %d\n", node->value);
    visited[visited_count++] = node->value;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık — üç dolaşma da

  • O(n) zaman: her düğüm bir kez, düğümde O(1) iş
  • O(h) özyineleme yığını alanı — ağacın yüksekliği
  • Dengeli ağaçta O(log n), ama bir zincirde O(n)
  • Bu en kötü durum, bölüm 3.4'ün kendi yığınını doğuruyor
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • Taban durumu unutmak — node == NULL dönmeli
  • Senaryolar arasında paylaşılan ziyaret sayacını sıfırlamamak
  • Üç sıranın "genelde aynı" olduğunu sanmak — tek bir ek düğüm bile ayırır
  • Yanlış dolaşmayı seçmek: kurmak preorder, silmek postorder ister
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

Bir ağacı bir dosyaya, değerleri geri okuyup
sırayla ekleyerek aynı ağacı yeniden kuracak
şekilde kaydetmeniz gerekiyor. Hangi sıra?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

Preorder. Geri okunan ilk değer kök
olmalı, ve preorder, kökü her iki altağaçtan
önce ziyaret eden tek sıradır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Özyinelemesiz inorder

Her özyinelemeli dolaşma, gizlice derleyicinin
çağrı yığınını kullanır. Bu kez özyineleme
yok — Hafta 3'ten kendi yığınımız, int
yerine Node * tutan.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Özyinelemesiz inorder, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — yığın en derin noktasına ulaşıyor

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — push / pop (kendi yığınımız)

static void push(Node *n) {
    top = top + 1;
    stack_data[top] = n;
}
static Node *pop(void) {
    Node *n = stack_data[top];
    top = top - 1;
    return n;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — ana döngü

Node *cur = root;
while (cur != NULL || !is_empty()) {
    while (cur != NULL) {
        push(cur);
        cur = cur->left;
    }
    cur = pop();
    printf("visit %d\n", cur->value);
    cur = cur->right;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • O(n) zaman — her düğüm bir kez push, bir kez pop
  • O(h) alan — özyinelemeli sürümle tam olarak aynı
  • Bellek kazancı yok; muhasebe yalnızca kendi yığınımıza taşındı
  • Kazanç: kendi yığınımız, sabit bir özyineleme sınırını aşabilir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • cur != NULL || !is_empty()in herhangi bir yarısını atlamak
  • Bir düğümü pop edip ziyaret ettikten sonra cur = cur->righti unutmak
  • Atlarsanız, her sağ altağaç sessizce kaybolur
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

Mükemmel yükseklik h bir ağaçta, bu
dolaşma boyunca yığında aynı anda en çok
kaç düğüm oturur?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

h + 1. Yığın her zaman yalnızca o anki
sol omurgayı tutar, ve mükemmel bir ağacın
en uzun sol omurgası h + 1 düğümlüdür.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Level order (genişlik öncelikli), bir kuyrukla

Şimdiye kadarki her dolaşma derine gider,
genişe gitmeden önce. Level order kökü,
sonra derinlik 1'deki her düğümü ziyaret
eder — bir kuyruk gerektirir, yığın değil.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Level order, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — kuyruk hep bir eleman tutuyor

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — enqueue / dequeue

static void enqueue(Node *n) {
    rear = (rear + 1) % QUEUE_CAP;
    queue_data[rear] = n;
    count++;
}
static Node *dequeue(void) {
    Node *n = queue_data[front];
    front = (front + 1) % QUEUE_CAP;
    count--;
    return n;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — ana döngü

enqueue(root);
while (!is_empty()) {
    Node *cur = dequeue();
    printf("visit %d\n", cur->value);
    if (cur->left != NULL) enqueue(cur->left);
    if (cur->right != NULL) enqueue(cur->right);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • O(n) zaman — her düğüm bir kez enqueue, bir kez dequeue
  • O(w) alan, w ağacın en büyük genişliği
  • Dallı, dengeli bir ağaçta w, O(n) kadar büyük olabilir
  • Her derinlik öncelikli dolaşmanın O(h) alanıyla karşılaştırın
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • dequeuei "zaten aynı kod" diye pop ile değiştirmek — sessizce derinlik öncelikliye döner
  • Yanlışlıkla NULL çocukları kuyruğa eklemek — bir sonraki dequeue'da çöker
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

İki farklı ikili ağaç, tam olarak aynı
level-order değer dizisini paylaşabilir mi?
Doğru mu yanlış mı?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

Doğru. Bir level-order dizisi, bir seviyede
herhangi bir boşluk olduğunda, ebeveyn-çocuk
ilişkilerini tek başına kodlamıyor.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

4. Tam Bir Ağaç Bir Dizide

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Başlangıç sorusu

İşaretçiler bellek maliyeti taşır, ve bir
ebeveyni bulmak ya saklı bir işaretçi ya da
bir arama ister. Tam bir ağaç için daha
ucuz bir yol var mı?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

İndis formülleri

  • İndis i'deki düğümün sol çocuğu: 2*i + 1
  • Sağ çocuğu: 2*i + 2
  • Ebeveyni: (i - 1) / 2 (tam sayı bölmesi)
  • Hiçbir yerde left, right, parent alanı yok — yalnızca bir dizi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Dizi gösterimi, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — TAM DEĞİL: bir boşluk

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — parent / left / right, is_complete

static int parent(int i) { return (i - 1) / 2; }
static int left(int i)   { return 2 * i + 1; }
static int right(int i)  { return 2 * i + 2; }

static bool is_complete(int arr[], int n, int last_real) {
    for (int i = 0; i <= last_real; i++)
        if (arr[i] == EMPTY) return false;
    return true;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • parent, left, right: saf aritmetik — O(1)
  • 10 düğüm ya da 10 milyon için maliyet aynı
  • is_completein kendisi: O(n), dizinin bir taraması
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • Bu formülleri, gerçekte tam olmayan bir ağaçta kullanmak
  • (i - 1) / 2ye, dilinizin tam sayı bölme kuralını kontrol etmeden güvenmek
  • Kökün (i = 0) ebeveyni olmadığını, özel bir durum olduğunu unutmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

Tam bir ikili ağaç, bir dizide saklı. İndis
11'deki düğümün iki çocuğu var. Hangi
indislerde? Ebeveyni hangi indiste?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

Çocuklar 2*11+1 = 23 ve 2*11+2 = 24de.
Ebeveyn (11-1)/2 = 5te.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

5. İkili Öbek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Başlangıç sorusu

Bir işletim sistemi, yüz bekleyen süreçten
en acilinin hangisi olduğunu, anında, tekrar
tekrar bilmeli. Her gelişte tüm listeyi
sıralamak boşa iş. En iyi değeri her zaman
elin altında tutan en ucuz yapı nedir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kısa bir tarihçe

  • 1964 — J. W. J. Williams, öbeği ve öbek sıralamasını birlikte tanıtıyor
  • 1964 — R. W. Floyd, O(n)'lik bir kurma yöntemi yayınlıyor
  • Öbek, tam olarak sıralamayı hızlandırmak için icat edildi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Öbek özelliği

  • Min-öbek: her ebeveyn ≤ her iki çocuk — en küçük kökte
  • Max-öbek: her ebeveyn ≥ her iki çocuk — en büyük kökte
  • Sıralı bir yapı değil — kardeşler arasında zorunlu sıra yok
  • Yalnızca her ebeveyn kendi iki çocuğunu yeniyor, fazlası değil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Öbek ADT'si

İşlem Ne yapar Karmaşıklık
peek() Kökü silmeden döndürür O(1)
insert(x) xi ekler, sift-up ile onarır O(log n)
extract() Kökü siler, sift-down ile onarır O(log n)
build_heap(arr) Bir diziyi tek seferde öbeğe çevirir O(n)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Ekleme: sift-up

Yeni değeri bir sonraki boş slota koyun —
ağacı tam tutar. Sonra öbek özelliği bozukken
tekrar tekrar ebeveyniyle yer değiştirin.
Buna sift-up denir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sift-up ile ekleme, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — zaten sıralı, sifting gerekmiyor

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — insert() / sift-up

void insert(int value) {
    heap[size] = value;
    int i = size;
    size++;
    while (i > 0) {
        int parent = (i - 1) / 2;
        if (!better(heap[i], heap[parent]))
            break;
        int tmp = heap[parent];
        heap[parent] = heap[i];
        heap[i] = tmp;
        i = parent;
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • insert: her seviyede en çok bir yer değiştirme — O(log n)
  • log n, n düğümlü tam bir ağacın yüksekliği
  • peek (heap[0]i okumak): O(1)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Çıkarma: sift-down

Kökü kaydedin, dizinin son elemanını
yerine taşıyın — ağacı tam tutar. Sonra
tekrar tekrar daha iyi çocuğuyla yer
değiştirin. Buna sift-down denir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sift-down ile çıkarma, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — sonuna kadar: 10 değerin tamamı

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — extract() / sift-down

int extract(void) {
    int best = heap[0];
    size--;
    heap[0] = heap[size];   /* ... */
    int i = 0;
    while (1) {              /* sift-down */
        /* ... target = sol/sağ çocuktan iyi olan ... */
        if (target == i)
            break;
        /* ... heap[i]/heap[target] değiştir ... */
    }
    return best;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • extract: her seviyede en çok bir yer değiştirme — O(log n)
  • sift-up'ın maliyetinin tam ayna görüntüsü
  • Aynı O(log n) sınırı, ters yönde
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar (ekleme ve çıkarma)

  • extracti önce size > 0 kontrol etmeden çağırmak
  • sift-down'da yalnızca bir çocukla karşılaştırmak, ikisiyle değil
  • betterde < yerine <= kullanmak — zararsız, ama eşitlik davranışını değiştirir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Bir öbeği O(n)'de kurmak

n tek tek ekleme toplamda O(n log n)
maliyetli. Floyd'un algoritması daha iyisini
yapar: her yaprak zaten geçerli bir öbek;
yalnızca iç düğümleri, sondan köke, sift edin.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Öbek kurma, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — girdi zaten geçerli bir öbek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — build_heap()

void build_heap(int arr[], int n) {
    for (int i = n / 2 - 1; i >= 0; i--)
        sift_down(arr, n, i);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Neden O(n), O(n log n) değil?

  • Kabaca n/2 düğüm yaprak — tamamen atlanıyor
  • Kabaca n/4 düğüm en çok 1, n/8'i en çok 2 yer değiştirme
  • "Yükseklik h'deki sayı çarpı h" toplamı O(n)'e yakınsıyor
  • Alttaki çok ucuz sift'ler, üstteki az sayıda maliyetliyi eziyor
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • Döngüye i = 0dan başlamak, i = n/2 - 1den değil — düzeltilmemiş altağaçları sift eder
  • build_heapi "yalnızca n tane insert" sanmak — geçerli, ama aynı dizilim ya da maliyet değil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

build_heap ve heap_sortın ana döngüsü
ikisi de tekrar tekrar sift_down çağırır.
Neden birincisi toplamda O(n), ikincisi
O(n log n)?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

build_heap, alttaki çoğunlukla ucuz düğümleri
sift eder. heap_sort, her çıkarmada bir kez,
her zaman kökten başlar — ortalanacak ucuz
bir çoğunluk yok.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Öbek sıralaması — fikir

build_heap, sonra tekrar tekrar kökü
sıralı kuyruğa taşıyın, küçültün, sift-down
yapın. Max-öbek artan sıralar; min-öbek
azalan sıralar.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Öbek sıralaması, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — zaten artan, maliyet yine aynı

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — heap_sort()

void heap_sort(int arr[], int n) {
    for (int i = n / 2 - 1; i >= 0; i--)
        sift_down(arr, n, i);
    for (int heap_size = n; heap_size > 1; heap_size--) {
        int tmp = arr[0];
        arr[0] = arr[heap_size - 1];
        arr[heap_size - 1] = tmp;
        sift_down(arr, heap_size - 1, 0);
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • build_heap: O(n); döngü sonra n − 1 kez çalışır
  • Her tur: bir O(1) yer değiştirme + bir O(log n) sift-down
  • Toplam: O(n log n) — yerinde sıralar, ekstra dizi yok
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • Öbek sıralamasının kararlı olduğunu sanmak — değil
  • Küçülen bölge yerine tüm dizi üzerinde sifting yapmak — sıralanmış kuyruğu bozar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

6. Öncelik Kuyruğu: Bir Öbeğin Hizmet Ettiği ADT

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

ADT

Bir öncelik kuyruğu, her biri bir
önceliğe sahip öğeleri yönetir.
insert/peek/extract, az önce kurduğunuz
öbek işlemlerine doğrudan karşılık gelir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Öncelik kuyruğu ADT'si

İşlem Ne yapar Karmaşıklık
insert(x) xi önceliğiyle ekler O(log n)
peek() En üstteki öğeyi döndürür, tutar O(1)
extract() En üstteki öğeyi siler, döndürür O(log n)
update_key(id, p) Bir öğenin önceliğini değiştirir O(n) naif
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

update_key — yeni olan tek parça

  • Öncelik değişir → öğe taşınması gerekebilir
  • Şimdi daha iyi: decrease-key — yukarı sift
  • Şimdi daha kötü: increase-key — aşağı sift
  • Gerçek kullanım: Dijkstra'nın algoritması, İS zamanlayıcıları
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Öncelik kuyruğu işlemleri, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — boşken extract/peek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — Item, insert()

typedef struct {
    int id;
    int key;
} Item;

void insert(int id, int key) {
    heap[size] = (Item){id, key};
    sift_up(size);
    size++;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — update_key()

void update_key(int id, int new_key) {
    int i = find_by_id(id);
    if (i == -1) { /* … print a message */ return; }
    heap[i].key = new_key;
    if (i > 0 && better(heap[i], heap[(i - 1) / 2]))
        sift_up(i);
    else
        sift_down(i);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • insert, extract: O(log n), öbekten devralınan
  • peek: O(1)
  • update_key: id için doğrusal taramayla O(n)
  • id→indis bir hash tablosu bunu O(log n)'e indirir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • Bir öğenin id'sini (kalıcı) dizi indisiyle (değil) karıştırmak
  • Kuyruğun boş olmadığını kontrol etmeden peek/extract çağırmak
  • update_keyden sonra yanlış yönde sift yapmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

Min-öncelik bir zamanlayıcı "teslime kalan
süre"yle anahtarlanıyor. Çalışan bir süreç,
çok daha acil bir istekle şimdi kesildi.
Decrease-key mi increase-key mi? Hangi sift?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

Decrease-key — daha acil, daha küçük
bir key demek. Bu, köke doğru yüzen
sift-upı tetikler; kök en küçüğü tutar.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

7. Öbek Varyasyonları: Bir Özelliği Başka Bir Özellikle Takas Etmek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

d-ary öbek

Aynı dizi tabanlı fikir, ama her düğümün
2 yerine en fazla D çocuğu var. Düğüm
i'nin c. çocuğu D*i + 1 + cde; ebeveyni
(i-1)/Dde. D = 2, düz ikili öbeği verir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

D-ary öbek çıkarma, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — D=3, sonuna kadar

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — D çocuklu extract()

int extract(void) {
    int best = heap[0];
    size--;
    heap[0] = heap[size];
    int i = 0;
    while (1) {
        int target = i, base = D * i + 1;
        /* ... base..base+D-1'de D çocuğu kontrol et ... */
        if (target == i) break;
        /* ... heap[i]/heap[target] değiştir ... */
    }
    return best;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • extract: O(D · logD n) — daha az seviye, seviyede daha çok
  • insert: O(logD n) — her zaman tek bir ebeveynle karşılaştırır
  • Büyük D: ucuz ekleme, potansiyel olarak maliyetli çıkarma
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • İkili öbeğin 2*i+1/2*i+2 formüllerini değiştirmeden yeniden kullanmak
  • Sadece daha kısa bir ağaç için büyük bir D seçmek, extract'in maliyetini gözden kaçırarak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Binom öbeği

Jean Vuillemin tarafından 1978'de
tanıtıldı. Binom ağaçlarından bir orman;
k. dereceden ağacın 2k düğümü var.
n elemanlı bir öbeğin dereceleri, tam
olarak n'nin ikilik tabandaki 1 bitleri.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Union: elde ile ikilik toplama

  • Dereceleri düşükten yükseğe gezin, iki sayı toplar gibi
  • Yalnızca biri bu derecede ağaç tutuyorsa → doğrudan geçer
  • İkisi de tutuyorsa → linklenirler, bir derece yukarı "elde" olur
  • Aynı anda en çok üç ağaç buluşabilir: A, B, ve gelen elde
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Binom öbeği birleştirme, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — tek büyük bir elde zinciri

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — union_heaps()

void union_heaps(Node *a[], Node *b[], Node *result[]) {
    Node *carry = NULL;
    for (int order = 0; order < MAX_ORDER; order++) {
        Node *group[3]; int g = 0;
        if (a[order]) group[g++] = a[order];
        if (b[order]) group[g++] = b[order];
        if (carry) group[g++] = carry;
        carry = NULL;
        /* ... g==0: none; g==1: pass through ... */
        /* ... g>=2: link() two trees, carry up ... */
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • link: O(1) — birkaç işaretçi ataması
  • union: en çok O(log n) dereceyi ziyaret eder — O(log n)
  • insert, tek bir 0. derece ağaçla union olarak tanımlanır — o da O(log n)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • Bir derecede yalnızca iki ağacın buluştuğunu düşünmek, elde üçüncüyü unutarak
  • inserti sıfırdan türetmek, sadece union çağırmak yerine
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Solcu öbek

C. A. Crane tarafından 1972'de tanıtıldı.
Genelde tam olmayan bir işaretçi ağacı,
tek bir işlem etrafında kurulu: merge.
insert ve extract, onun özel durumları.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Solcu özellik

  • Her düğüm kendi null path lengthini (npl) izler
  • NULLın npl'si −1; bir yaprağınki 0
  • Solcu: sol çocuğun npl'si sağınkinden asla küçük değil
  • Sonuç: sağ omurga her zaman O(log n) uzunlukta
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Solcu öbekte birleştirme, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — boş bir öbekle birleştirme

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — merge() (özyinelemeli)

Node *merge(Node *t1, Node *t2) {
    if (t1 == NULL) return t2;
    if (t2 == NULL) return t1;
    if (!better(t1->key, t2->key)) {
        Node *tmp = t1; t1 = t2; t2 = tmp;
    }
    t1->right = merge(t1->right, t2);
    if (npl(t1->left) < npl(t1->right)) {
        /* ... t1->left ve t1->right yer değiştir ... */
    }
    t1->npl = npl(t1->right) + 1;
    return t1;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • merge: O(log n), her iki sağ omurgayla sınırlı
  • insert, extract: ikisi de merge üzerinden tanımlı — aynı O(log n)
  • Ağacın kalanı ne kadar dengesiz olursa olsun geçerli
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • npli (en yakın eksik çocuğa uzaklık) yükseklikle karıştırmak
  • merge'den sonra çocuk yer değiştirmeyi atlamak — solcu özelliği sessizce bozar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

İki büyük öbeği, tek tek eleman eklemekten
çok daha sık, birleştirmeniz gerekiyor.
Hangi varyasyon en uygun?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

Solcu öbek (ya da binom öbeği). İkisi
de merge/union'ı yalnızca O(log n)'e mal
edecek şekilde kurulu — düz ya da d-ary
öbekte böyle bir yol yok.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

8. Huffman Kodlaması

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Başlangıç sorusu

Düz ASCII her karaktere 8 bit harcar, E
de Z de aynı. Sık geçen karakterler kısa
kod alsaydı, nadirler uzun — Morse kodunun
zaten yaptığı gibi?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kısa bir tarihçe

  • 1952 — David Huffman, MIT'de bir dönem ödevi
  • Hoca Fano'nun kendi yöntemi iyiydi, ama optimal değildi
  • Huffman'ın açgözlü ağaç birleştirmesi kanıtlanabilir optimal
  • Bugün hâlâ ZIP, JPEG ve MP3'ün içinde
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Ağacı kurmak

Her sembolü sıklığıyla anahtarlanmış bir
min-öbeğe koyun. Tekrar tekrar: en
küçük iki kökü pop edin, bu ikisini
çocuk yapan yeni bir iç düğüm kurun, geri
push edin. Bire kalana kadar tekrarlayın.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Huffman ağacını kurmak, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — en küçük anlamlı örnek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — birleştirme döngüsü

int merge_id = 256;
while (heap_size > 1) {
    Node *a = heap_pop();
    Node *b = heap_pop();
    Node *parent = new_internal(a, b, merge_id++);
    heap_push(parent);
}
Node *root = heap_pop();
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kodlamak ve kod açmak

Bir sembolün kodu, köke kadar yolu: sol
= 0, sağ = 1. Kod açmak kökten bit
bit yürür; bir yaprak bir karakter üretir ve
yeniden başlar. Bu, kod önek-serbest
olduğu için çalışır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kodlama ve kod açma, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Uç durum — çok çarpık: 9 A, 1 B

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — assign_codes() (ağacı gezmek)

static void assign_codes(Node *node, char *path,
                          int depth) {
    if (node->left == NULL && node->right == NULL) {
        path[depth] = '\0';
        strcpy(codes[(unsigned char) node->ch], path);
        return;
    }
    path[depth] = '0';
    assign_codes(node->left, path, depth + 1);
    path[depth] = '1';
    assign_codes(node->right, path, depth + 1);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kod — decode() (bit bit yürümek)

static char *decode(const char *bits, Node *root,
                     char *out) {
    int n = 0;
    Node *node = root;
    for (int i = 0; bits[i] != '\0'; i++) {
        node = bits[i] == '0' ? node->left : node->right;
        if (node->left == NULL && node->right == NULL) {
            out[n++] = node->ch;
            node = root;
        }
    }
    out[n] = '\0';
    return out;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Karmaşıklık

  • Kurma: n − 1 birleşme, her biri O(log n) — O(n log n)
  • Kodlama: O(L) — karakter başına bir arama ve ekleme
  • Kod açma: O(B) — kodlanmış bit başına bir ağaç adımı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Sık yapılan hatalar

  • Belirleyici bir tie-breaker olmadan — eşit sıklıklar iki farklı, ikisi de optimal ağaç kurabilir
  • Kod tablosunun ASCII gibi sabit olduğunu sanmak — mesaj başına kurulur
  • Yalnızca decodei test etmek, tam decode(encode(text)) == text turunu değil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Mini soru

Bir Huffman ağacında, bir sembolün kodu
başka bir sembolün kodunun öneki
olabilir mi?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Cevap

Hayır. Her sembol tam olarak bir
yapraktır, ve bir yaprağın çocuğu yok —
o yüzden hiçbir kod daha uzun, farklı bir koda uzatılamaz.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Özet — ağaçlar, biçimler, dolaşmalar, dizi

Fikir Anahtar gerçek
Ağaç Bir kök, çevrim yok, n düğüme n−1 kenar
İkili ağaç biçimleri Dolu, tam, mükemmel, dejenere, dengeli
Dolaşmalar Pre/in/post (özyinelemeli), yinelemesiz, level order
Dizi gösterimi 2i+1, 2i+2, (i-1)/2 — hepsi O(1)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Özet — öbekler, öncelik kuyruğu, Huffman

Fikir Anahtar gerçek
İkili öbek insert/extract O(log n); kurma O(n)
Öbek sıralaması O(n log n), yerinde, kararlı değil
Öncelik kuyruğu update_key kalıcı bir id ister
Varyasyonlar d-ary (hızlı insert), binom/solcu (hızlı merge)
Huffman kodlaması Ağaçlardan bir min-öbek; önek-serbest kodlar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Büyük resim

Tek bir yapı, öbek, iki hareketten —
sift-up, sift-down — kurulu, bir sıralama,
bir öncelik kuyruğu, üç varyasyon, ve
optimal bir sıkıştırma kodu üretiyor.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kendini sınama turu

Dört kısa soru. Cevap bir sonraki slaytta
gelmeden önce düşünün. Tam alıştırmalar ve
on soruluk bir sınav hafta notlarında.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

1. İkili bir ağacın yüksekliği 4 ise en çok kaç düğümü olabilir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

25 − 1 = 31 düğüm — o yükseklikte mükemmel bir ağaç.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

2. Tam bir ağaç bir dizide saklıyken, 9. düğümün ebeveyn indisi nedir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

(9 - 1) / 2 = 4, tam sayı bölmesiyle.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

3. n elemandan bir öbek kurmak neden "mantıklı görünen" O(n log n) değil, O(n)?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Çoğu düğüm alttadır, sift-down'ın ucuz olduğu yerde; toplam O(n)'e yakınsar.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

4. Bir öncelik kuyruğunda her öğe neden kalıcı, sabit bir id ister?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Bir öğenin dizideki konumu neredeyse her işlemde değişir; yalnızca id sabit kalır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Gelecek hafta

Hafta 5 — Çizgeler ve Dolaşmalar

"Çevrim yok, bir ebeveyn" kuralını bırakın,
bir ağaç bir çizge olur. Level order,
BFS'e genelleşir; bugün kurduğunuz öncelik
kuyruğu, Dijkstra'nın algoritmasının motoru olur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kaynaklar (1/2)

  • Ders izlencesi, Hafta 4: docs/syllabus/syllabus.tr.md
  • Cormen, Leiserson, Rivest, Stein. Introduction to
    Algorithms
    , 4. baskı. MIT Press
  • Sedgewick, Wayne. Algorithms, 4. baskı. Addison-Wesley
  • Knuth. The Art of Computer Programming, Cilt 1, 3. baskı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 4

Kaynaklar (2/2)

  • Huffman (1952) · Williams (1964) · Floyd (1964)
  • Vuillemin (1978) — binom öbeği
  • Cayley (1857) — ilk ağaç sayma makalesi
  • williamfiset/Algorithms · Programiz DSA
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz

Konuşma notu: Bugün bir düğüm birden fazla düğüme işaret edebiliyor. Bir işaretçinin ikiye çıkması — listeden ağaca geçişin tamamı bu. Bu tek değişiklik, bugün öbeği, öncelik kuyruğunu ve Huffman kodlamasını, hepsini bir oturumda kuruyor.

Konuşma notu: On sekiz kısa animasyon dersin tamamını taşıyor; her biri, fikri tanıttığımız yerde bir kez görünüyor, birçoğu en can alıcı uç durumuna da bir kez daha bakıyor.

Konuşma notu: Her terim ilk geçtiği yerde tam olarak tanımlanır; bu tablo yalnızca onu nerede tekrar bulacağınızı söylüyor.

Konuşma notu: İsterseniz şimdi bir terminal açın; bugünün her kod parçası tam olarak gösterildiği gibi derlenir ve çalışır.

Konuşma notu: Bir ağaç düğümü, bir işaretçi alanı daha fazla olan bağlı liste düğümüdür — yeni olan gerçekten bu kadar.

Konuşma notu: Bellek konusunda bugün yeni bir şey yok — yalnızca aynı işaretçi ve yığın/kuyruk fikirlerinden kurulu yeni biçimler var.

Konuşma notu: Bu haritadaki her kutu aşağıda kendi slaytlarını alıyor, çoğu kısa bir animasyon ve eksiksiz bir C/Java programıyla.

Konuşma notu: Bölüm 1, sonraki her bölümün üzerine kurulduğu terimleri — kök, ebeveyn, çocuk, yaprak, derinlik, yükseklik — bir düğümün istediği sayıda çocuğu olabildiği genel bir ağaçta kuruyor.

Konuşma notu: Sorun: bu biçim bir yığın mı, bir kuyruk mu, yoksa yeni bir şey mi? Dallanıyor — bugünün tüm yeniliği bu.

Konuşma notu: Cayley bilgisayarı hiç düşünmüyordu — hidrokarbon izomerlerini sayıyordu, dallanma yapıları tam olarak bir ağaç.

Konuşma notu: "Kök neden en üstte" diye sorun — bir doğa kanunu değil, ama bu alanda tamamen evrensel bir gelenek.

Konuşma notu: Bu tablodaki her terim, hemen sonraki animasyonda, sırayla, gerçek bir ağaç üzerinde işaret ediliyor.

Konuşma notu: n-1 kenar üzerinde durmaya değer: kök hariç her düğümün tam olarak bir kenarı var, kendi ebeveynine.

Konuşma notu: Derinlik kökten aşağı sayar; yükseklik bir düğümden en derin yaprağına aşağı sayar — sayma yönü kafa karıştıran şey.

Konuşma notu: Normal örnek: 11 düğümlü dallı bir ağaç. Her terimin aynı gerçek ağaç üzerinde, sırayla, nasıl yanıp söndüğünü izleyin.

Konuşma notu: Yıldız "derece"yi en zorlu şekilde sınar: derecesi 10 olan bir düğüm, her biri derecesi 0 olan on yaprak, ve yüksekliği yalnızca 1 olan bir ağaç.

Konuşma notu: Bunu Hafta 2'nin bağlı liste düğümüyle karşılaştırın: aynı fikir, ama children artık bir dizi, çünkü genel bir ağaç düğümünün birden fazla çocuğu olabilir, tek bir "next" değil.

Konuşma notu: Bir yaprağın yüksekliği taban durumu, 0; başka her düğüm 1 + en yüksek çocuğu — kuyruk gerekmez, saf özyineleme.

Konuşma notu: Derinlik önce ebeveynin cevabına ihtiyaç duyar, o yüzden bir kuyrukla yukarıdan aşağı yürür — height'ın aşağıdan yukarı özyinelemesinin ayna görüntüsü.

Konuşma notu: Biçim, bu hafta ilerledikçe, toplam iş değil de özyineleme *derinliği* söz konusu olunca çok önem kazanacak.

Konuşma notu: İkili sınırlama tam olarak bir sonraki bölümde başlıyor, ve bu bir doğa kanunu değil, hilelerinden ötürü yaptığımız bir seçim.

Konuşma notu: Sonraki slayttan önce her iki cevabı da sınıfa sordurun.

Konuşma notu: Derinlik, kökten her seviye aşağı inildiğinde tam olarak bir artar — kısayol yok, istisna yok.

Konuşma notu: Bir sınırlama — en çok iki çocuk, left ve right adıyla — öbeği, Huffman kodlamasını ve gelecek dönemin arama ağaçlarını açıyor.

Konuşma notu: Karşılığı, dizi indisleri üzerinde bölüm 4'ün tanıtacağı aritmetik hileler — sınırsız çocukla imkânsız.

Konuşma notu: Bu haftanın kalan her programı tam olarak bu struct'ın üzerine kuruluyor — bağlı liste düğümünden bir işaretçi fazla.

Konuşma notu: Bunlar beş bağımsız evet/hayır sorusu — bir ağaç tam olmadan dolu olabilir, ya da tersi.

Konuşma notu: Normal örnek: 12 düğüm, tam ama mükemmel değil. Animasyon aynı ağaç üzerinde beş evet/hayır sorusunu da soruyor.

Konuşma notu: Dejenere bir ağaç dolu, tam ve mükemmelin hepsinde birden başarısız, ve yüksekliği n-1 — düz bir bağlı liste kadar kötü.

Konuşma notu: Bu iki formül sürekli geri geliyor — bölüm 5'teki öbek ikisine de dayanıyor.

Konuşma notu: Denge, gelecek dönem ikili arama ağaçlarını rastgele değil dikkatle kurmaya değer kılan tek sebep.

Konuşma notu: Bu, bir kuyrukla seviye seviye yürür, bilerek NULL yer tutucular ekler, ki boşluktan sonra gerçek bir düğüm yakalanabilsin.

Konuşma notu: Tek bir gözcü değer, -1, "artık dengesiz" bilgisini özyineleme boyunca yukarı taşır, aynı altağacı iki kez gezmeden.

Konuşma notu: h yükseklik, ve dejenere bir ağacın O(n) yığın alanı tam olarak bu yüzden en kötü durum.

Konuşma notu: Yukarıdaki tek geçişli check_balance, tam olarak bu çok yaygın tuzağı önlemek için var.

Konuşma notu: İki slayt öncesindeki formülleri kullanın.

Konuşma notu: Her mükemmel ağacın yaprak sayısı, toplam düğümünün yaklaşık yarısı — iyi bir sağlık kontrolü.

Konuşma notu: Bir ağacın tek "doğal" bir sırası yok — düğümün iki çocuğu var, o yüzden hangisinin önce ve düğümün kendisinin ne zaman ziyaret edileceğine dair gerçek bir seçim var.

Konuşma notu: Aşağıdaki beş program aynı 10 düğümlü dengeli ağacı paylaşır: [50,30,70,20,40,60,80,10,-,-,45,55] — değişen yalnızca ziyaret sırası.

Konuşma notu: Diziyi geri okurken, okunan ilk değer her zaman bir sonraki altağacın köküdür.

Konuşma notu: Vurgulanan çağrı yolunun kökten şu an etkin olan çağrıya kadar izlediği rotayı gözlemleyin.

Konuşma notu: Yalnızca sol çocuklarla, preorder zincirin kurulduğu sırayla ziyaret eder — her zaman ziyaret, sonra tek çocuk.

Konuşma notu: Önce ziyaret, sonra sol, sonra sağ — taban durum, node == NULL, ilk sırada olmalı, yoksa boş bir altağaçta çöker.

Konuşma notu: Bu gösterim ağaçlarında, BST kurallarıyla kurulmadıkları için, inorder yine de sol-önce-kendi-sonra-sağ çalışır; sadece sıralanmış çıkmaz.

Konuşma notu: Normal ağaçta, [50,30,70,...], inorder tam olarak sıralı çıkıyor: 10 20 30 40 45 50 55 60 70 80.

Konuşma notu: Yalnızca sağ çocuklarla önce ziyaret edilecek sol altağaç yok, o yüzden inorder tam olarak zincirlenme sırasında çıkar — sola yığılmışın tersi.

Konuşma notu: preorder ile tıpatıp aynı biçim — yalnızca "visit" satırının yeri, ilk yerden ortaya, değişiyor.

Konuşma notu: Bir düğümün çocuklarını, düğümün kendisinden önce serbest bırakın, yoksa serbest bırakılmış işaretçilere tekrar ihtiyaç duyarsınız.

Konuşma notu: Bu koşunun ilk ve son yazdırılan değerlerini preorder'ınkiyle karşılaştırın — burada kök son, orada ilk.

Konuşma notu: Sol altağaç olmadan, postorder yine "kendini son ziyaret et"i saklar, o yüzden sağ zincir tam ters sırayla çıkar.

Konuşma notu: Her zamanki üç satır, yalnızca sona taşınmış — ziyaret, sol, sağ; sol, sağ, ziyaret oluyor.

Konuşma notu: Üçü arasında değişen tek şey "ziyaret, sol, sağ"ın sırası; toplam iş asla değişmiyor.

Konuşma notu: Üçü de "her düğümü ziyaret eder", o yüzden yanlış seçim yine de çalışır — hata yalnızca sıra önem kazandığında ortaya çıkar.

Konuşma notu: Hangi değerin ilk okunması gerektiğini düşünün.

Konuşma notu: Bu tam olarak preorder slaytlarının başındaki "sıfırdan kurmak" özelliği.

Konuşma notu: Tüm sol omurgayı push edin; artık sola gidemeyince pop edin, ziyaret edin, sonra sağ altağaca yürüyün ve tekrarlayın.

Konuşma notu: Sol omurga push edilirken yığının büyüdüğünü, sonra her pop'ta bir düğüm ziyaret edildikçe küçüldüğünü izleyin.

Konuşma notu: 10 düğümün hepsi tek biri pop edilmeden önce push edilir — yığın derinliği zincirin tamamına eşit.

Konuşma notu: Hafta 3'ün tam olarak aynı dizi tabanlı yığını — yalnızca eleman türü int'ten Node *'a değişti.

Konuşma notu: Tüm sol omurgayı push edin, pop edip ziyaret edin, sonra sağa adım atıp tekrarlayın — dış while'ın her iki yarısı da önemli.

Konuşma notu: Çok derin, dejenere bir ağaç özyinelemeli çağrı yığınını çökertebilir; kendi dizi tabanlı yığınımız daha nazikçe biter.

Konuşma notu: Bu döngü koşulunun her iki yarısı da önemli — ilkini atlarsanız çok erken durursunuz, ikincisini atlarsanız sonsuza kadar döner.

Konuşma notu: Yığının o an tam olarak hangi düğümleri tuttuğunu düşünün.

Konuşma notu: 0'dan h'ye kadar derinlikler, dahil — bu h+1 düğüm, hiçbir zaman daha fazla değil.

Konuşma notu: Kuyruğa eklenen ilk düğüm, kök, işlenen de ilk olmalı — bu tam olarak FIFO, bir yığın yanlış sıra verirdi.

Konuşma notu: Bir sonraki derinlik başlamadan önce her derinliğin tamamen bittiğini izleyin — 50, sonra 30 ve 70, sonra dört torun.

Konuşma notu: Burada her düğümün tek çocuğu var, o yüzden hiçbir derinlikte birden fazla düğüm hiç yok — kuyruk 1 boyutunu asla geçmiyor.

Konuşma notu: Hafta 3'ün tam olarak aynı dairesel kuyruğu — rear -1'den başlar ki ilk enqueue doğru şekilde 0. indise otursun.

Konuşma notu: Bölüm 2'nin tamlık kontrolünün tersine, bu döngü asla NULL eklemez — iki kuralı bir arada karıştırmak klasik bir hata kaynağı.

Konuşma notu: Derinlik öncelikli dolaşmalar genişliği derinlikle takas eder; level order derinliği genişlikle — hiçbiri bedava değil.

Konuşma notu: Kod her iki durumda da derlenir ve çalışır; hatayı yalnızca gerçek ziyaret sırası ortaya çıkarır.

Konuşma notu: Tek başına bir level-order dizisinin hangi düğümün kimin çocuğu olduğunu söyleyip söylemediğini düşünün.

Konuşma notu: Bir preorder-artı-inorder çifti birlikte belirli bir ağacı belirler; tek başına bir level-order dizisi belirlemez.

Konuşma notu: Tam olarak tam bir ağaç için, bir indis üzerinde aritmetik her işaretçinin yerini alır — hiç malloc yok, hiç left/right alanı yok.

Konuşma notu: Var — ve bu tam olarak bölüm 5'teki ikili öbeğin kurulu olduğu gösterim.

Konuşma notu: Üç formül gösterimin tamamı; her şey tek bir düz dizi üzerinde saf aritmetik.

Konuşma notu: Normal örnek: 12 düğüm, tam, hiç boşluk yok — her formül resmin söylediği yere tam olarak iniyor.

Konuşma notu: İndis 9 ve 10 boş ama indis 11 dolu — boşluktan sonra tek bir gerçek düğüm, tamlığı tamamen bozmaya yeter.

Konuşma notu: Üç tek satırlık formül, sonra bir döngü: son gerçek düğümden önceki herhangi bir boş slot, tamlığın hayır olması demek.

Konuşma notu: O(1) çocuk/ebeveyn erişimi, dizi gösteriminin tüm amacı — ve öbeğin bir sonraki bölümde tam olarak ihtiyaç duyduğu şey.

Konuşma notu: Formüller her durumda *bir* indis hesaplar; tam olmayan bir ağaçta o indis anlamsız olabilir.

Konuşma notu: Birkaç slayt öncesindeki üç formülü uygulayın.

Konuşma notu: Aynı üç formül, her zaman, ağaç ne kadar büyük olursa olsun.

Konuşma notu: İkili öbek, bölüm 4'ten tam bir ağaç, tek bir ek kuralla: her ebeveyn her iki çocuğunu da yeniyor.

Konuşma notu: Her gelişte sıralamak, geliş başına O(n log n) maliyetli — bu kadar sık bir şey için çok yavaş.

Konuşma notu: Her iki makale de aynı yıl çıktı — öbek ve öbek sıralaması hiçbir zaman gerçekten ayrı fikirler değildi.

Konuşma notu: Öbekler hakkında en yaygın yanlış anlama bu: bir öbek sıralı bir dizi değil, yalnızca kısmen sıralı.

Konuşma notu: Dört işlem, ve sonraki dört alt bölüm tam olarak bu dördünü, bu sırayla kuruyor.

Konuşma notu: Özellik sağlandığı ya da değer köke ulaştığı an durun — hangisi önce gelirse.

Konuşma notu: Normal örnek: bir min-öbek, sırayla eklenen 10 değer: 15, 7, 22, 3, 18, 9, 30, 1, 25, 12.

Konuşma notu: Bir min-öbeğe artan 12 değer: her ekleme öbek özelliğini zaten sağlıyor, o yüzden tek bir yer değiştirme bile olmuyor.

Konuşma notu: better(), min-öbek ile max-öbeği bir fonksiyon arkasına gizler, o yüzden sift-up döngüsünün kendisi hiç değişmez.

Konuşma notu: Boyut değil yükseklik, insert'in maliyetini belirler — bölüm 2'nin "denge neden önemli" fikri işbaşında.

Konuşma notu: Önce boyutu bir azaltın, sonra sift edin — taşınan eleman genellikle kökte hiç durmaz.

Konuşma notu: Normal örnek: bir min-öbek, 12 değer, 3 çıkarma — son elemanın köke paraşütle inip sonra geri battığını izleyin.

Konuşma notu: 10 değerin hepsini birer birer çıkarmak, tamamen sıralı bir sonuç veriyor — bu bir tesadüf değil, öbek sıralamasının tam kendisi.

Konuşma notu: Yalnızca sol çocukla değil, her ikisiyle de karşılaştırın — tek tarafla karşılaştırmak diğer tarafta özelliği bozuk bırakabilir.

Konuşma notu: insert en çok log n seviye tırmanır; extract en çok log n seviye batar — yükseklikler, yine, her şeyi belirler.

Konuşma notu: Boş bir öbekte extract, heap[-1] bitişiği belleği sessizce okur — güvenli bir çökme değil, tehlikeli bir hata.

Konuşma notu: Bu gerçekten şaşırtıcı bir sonuç — kurma, n ekleme kadar maliyetli görünür ama değil.

Konuşma notu: Normal örnek: bir max-öbek, rastgele sırada 10 değer — n/2 yapraktan kaçının hiç hareket ettiğini izleyin.

Konuşma notu: Her sift-down çağrısı target == i'yi hemen bulur ve hiçbir şey yapmaz — build_heap, girdinin gerektirdiği kadar iş yapar, ne fazla.

Konuşma notu: sift_down burada extract'in sift-down döngüsünün ta kendisi; yeni olan tek şey hangi düğümlerin, hangi sırayla çağrıldığı.

Konuşma notu: Bu, tüm haftanın gerçekten şaşırtıcı tek karmaşıklık sonucu — bir süre üzerinde durmaya değer.

Konuşma notu: Döngü sondan köke, geriye doğru çalışmalı, ki her düğüm sift edildiğinde altağaçları zaten geçerli olsun.

Konuşma notu: Her sift-down çağrısının ağaçta nereden başladığını düşünün.

Konuşma notu: Aynı fonksiyon, sift_down, iki çok farklı örüntüde çağrılıyor, iki çok farklı toplam maliyetle.

Konuşma notu: build_heap ve extract ikisi de var olduğunda, sıralamak neredeyse bedava — bu bölüm ikisini birbirine bağlıyor.

Konuşma notu: Normal örnek: bir max-öbekle artan sıralama, 10 değer — sıralı bölgenin dizinin sonundan geriye büyümesini izleyin.

Konuşma notu: build-heap'in tersine, öbek sıralaması adaptif değil — zaten sıralı bir girdi yine de tam O(n log n) maliyetli, yer değiştirme yer değiştirmesine.

Konuşma notu: Az önceki aynı build_heap döngüsü, sonra n-1 tur yer değiştirme-ve-sift, her biri küçülen bir bölgede.

Konuşma notu: Birleştirme sıralaması ya da hızlı sıralamanın ortalama durumuyla aynı asimptotik sınıf, ama ekstra bellek gerekmeden.

Konuşma notu: Kararlı bir sıralama gerekiyorsa, öbek sıralaması iyi karmaşıklığına rağmen yanlış araç.

Konuşma notu: Bir kuyruk ilk gelene hizmet eder; bir öncelik kuyruğu, geliş sırası ne olursa olsun, en önemliye hizmet eder.

Konuşma notu: Burada gerçekten yeni bir şey yok — bölüm 5'teki öbek, bir öncelik kuyruğunu gerçekleştirmenin en yaygın yolu.

Konuşma notu: update_key gerçekten yeni tek işlem, ve her öğenin kalıcı bir id'ye ihtiyaç duymasının tek sebebi.

Konuşma notu: Her öğe kalıcı bir id ister, dizide nereye taşınırsa taşınsın değişmeyen — yoksa update_key onu bir daha bulamaz.

Konuşma notu: Normal örnek: min-öncelik, 10 insert, bir peek, 2 extract, bir update-key — bölüm 5'in heap-insert'iyle aynı 15,7,22,3,18,... değerleri.

Konuşma notu: Öbek işlemlerinin kendisi değil, çağıran taraf size > 0 kontrol eder — bu senaryo, o kontrolün taşmayı güvenle yakaladığını gösteriyor.

Konuşma notu: Artık her öğe key'inin yanında kalıcı bir id taşıyor — öğenin dizideki slotu değişse de id hiç değişmiyor.

Konuşma notu: find_by_id burada doğrusal bir tarama — gerçek bir sistem id'den indise bir hash tablosu ekler, bunu da O(log n) yapmak için.

Konuşma notu: Bu ekstra muhasebe, klasik bir alan-zaman takası — binlerce öğe devrede olduğunda buna değer.

Konuşma notu: Decrease-key yukarı sift ister; increase-key aşağı sift ister — yanlışını kullanmak öbeği sessizce bozar.

Konuşma notu: Min-öncelik kuyruğunda "daha acil"in key'in sayısal değeri için ne anlama geldiğini düşünün.

Konuşma notu: Min-öncelik kuyruğunda küçük her zaman daha iyidir — bölüm 5'in min-öbeğiyle aynı kural.

Konuşma notu: Aşağıdaki her varyasyon, düz ikili öbeğin bir özelliğini gevşetiyor ya da değiştiriyor, farklı bir kazanç karşılığında.

Konuşma notu: Büyük bir D, insert'i ucuzlatır (daha az seviye, seviyede bir karşılaştırma) ama extract'i pahalılaştırır (seviyede D'ye kadar karşılaştırma).

Konuşma notu: Normal örnek: D=3, bir min-öbek, 12 değerden 3 çıkarma — her sift-down'ın aynı anda 3 çocukla karşılaştığını izleyin.

Konuşma notu: 10 değerin hepsi birer birer çıkarılıyor — yine tamamen sıralı çıkıyor, düz ikili öbeğin sonuna kadar durumu gibi.

Konuşma notu: base = D*i+1, ikili öbeğin 2*i+1'inin yerini alıyor — extract'in her diğer satırı tıpatıp aynı biçimde kalıyor.

Konuşma notu: Ekleme ağırlıklı iş yüklerinde, ağ olayı zamanlayıcıları gibi, popüler — extract nispeten seyrek olduğunda.

Konuşma notu: 2*i+1 ve 2*i+2, D*i+1+c'nin yalnızca D=2 özel durumu — yanlış D koyarsanız yanlış dizi hücresine dokunulur.

Konuşma notu: 13 = 0b1101, dereceleri 0, 2 ve 3'e ayrışır — 1, 4 ve 8 büyüklüğünde ağaçlar, toplamda 13.

Konuşma notu: Bu "üç ağaç aynı anda" durumu, animasyondaki zor senaryonun tam olarak sınadığı şey.

Konuşma notu: Normal örnek: min, A'nın 7 elemanı var (dereceler 0,1,2), B'nin 5 (dereceler 0,2) — eldelerin yukarı dalgalanmasını izleyin.

Konuşma notu: A (derece 3) union B (derece 3): tek bir elde her derecede dalgalanıyor — ikilik tabanda 1000 + 1000 toplamak gibi.

Konuşma notu: link(), daha kötü olan kökü daha iyi olanın yeni en soldaki çocuğu yapar — O(1), yalnızca birkaç işaretçi güncellemesi.

Konuşma notu: Düz bir ikili öbeğin insert'i de O(log n), ama tamamen farklı bir sebeple: sift-up, linkleme değil.

Konuşma notu: insert, ezberlenecek ayrı bir algoritma değil — tam olarak tek elemanlı bir ikinci öbekle union_heaps.

Konuşma notu: insert, yeni bir düğümle merge; extract, kökün kendisi silindikten sonra iki çocuğunun merge'ü.

Konuşma notu: Ağacın kendisi çok dengesiz olabilir — yalnızca sağ omurganın kısa olması garanti, ve merge yalnızca o omurgada yürür.

Konuşma notu: Normal örnek: min, A'nın 5 elemanı, B'nin 6 — merge'ün her iki sağ omurgayı nasıl birleştirip sonra npl'leri düzelttiğini izleyin.

Konuşma notu: A boş, 11 elemanlı B ile birleşiyor — merge'ün iki taban durumu (t1 == NULL, t2 == NULL) bunu hemen çözer.

Konuşma notu: Daha iyi kök her zaman kazanır ve diğer ağacı kendi sağ tarafına yutar, sonra yer değiştirme solcu özelliği onarır.

Konuşma notu: Yalnızca sağ omurganın uzunluğu önemli, ve solcu özellik onun her zaman kısa olmasını garanti eder.

Konuşma notu: O yer değiştirmeyi atlarsanız, tüm O(log n) kısa-sağ-omurga garantisi sessizce geçerliliğini kaybeder.

Konuşma notu: Hangi yapının iki bütün öbeği birleştirmek için hiç hızlı bir yolu olmadığını düşünün.

Konuşma notu: Düz bir dizi öbeğin tek birleştirme yolu, bir öbeğin her elemanını tek tek diğerine eklemek.

Konuşma notu: Bu haftanın kurduğu her şeyin ödülü: yalnızca ağaçlardan bir öbek, optimal bir sıkıştırılmış kod üretiyor.

Konuşma notu: Sorun: karışık uzunluklu kodlar bir bit akışında belirsiz olabilir, çok özel bir özellik olmadan.

Konuşma notu: Hocası sınıfa bir seçim sundu: final sınavı, ya da kanıtlanabilir optimal bir önek kodu bulmak — Huffman birini buldu.

Konuşma notu: Nadir semboller erken birleşir, altta kalır; sık semboller geç birleşir, üstte kalır — kısa kodları veren tam olarak bu.

Konuşma notu: Normal örnek: İngilizce harf benzeri sıklıklarla 10 sembol — en küçük iki kökün tekrar tekrar birleşmesini izleyin.

Konuşma notu: Yalnızca 2 sembol: bir birleşme, bir kök, bitti — "bir ağaç kur"un bile bir anlam taşıdığı en küçük girdi.

Konuşma notu: heap_pop/heap_push, tam olarak bölüm 5'in min-öbek extract/insert'i — sayı yerine Node işaretçilerini sıralıyor.

Konuşma notu: Her sembol tam olarak bir yaprak, ve bir yaprağın çocuğu yok — o yüzden hiçbir kod başka birinin öneki olamaz.

Konuşma notu: Normal örnek: "ABRACADABRA", 11 karakter — 88 düz-ASCII bit 23'e düşüyor, çünkü A tek başına 11 karakterin 5'i.

Konuşma notu: Yalnızca 2 sembol kaldı, o yüzden karakter başına 1 bit mümkün olan en iyisi — 80 yerine 10 bit, sıklıklar ne kadar çarpık olursa olsun.

Konuşma notu: Yalnızca yapraklar bir kod kaydeder; her iç düğüm yolu yalnızca bir 0 (sol) ya da 1 (sağ) ile uzatır.

Konuşma notu: Bit başına bir ağaç adımı; bir yaprağa ulaşılan an, karakterini üretin ve yürüyüşü kökten yeniden başlatın.

Konuşma notu: L metnin karakter uzunluğu; B kodlanmış mesajın bit uzunluğu.

Konuşma notu: Kod açıcı her zaman ya ağacın kendisine ya da sıklık tablosuna, kodlanmış bitlerin yanında, ihtiyaç duyar.

Konuşma notu: Bir yaprağın ağaçtaki konumunun neye izin verip neye izin vermediğini düşünün.

Konuşma notu: Bu "önek-serbest" özellik, tam olarak tek geçişli, belirsizliksiz kod açmayı mümkün kılan şey.

Konuşma notu: Aynı ağacı ziyaret etmenin beş yolu, ve tam olan birini tek bir işaretçi olmadan saklamanın bir yolu.

Konuşma notu: Bu beş satırın her biri, aynı iki hareketten kurulu: sift-up ve sift-down.

Konuşma notu: Bir öğrenci bugünden tek bir cümle hatırlayacaksa, hatırlamaya değer olan bu.

Konuşma notu: Bunlar yazılı notların sonundaki kendini sınamayı yansıtıyor, burada daha kısa bir setle, slayt başına bir soru.

Konuşma notu: Sorun, bekleyin, sonra ilerleyin.

Konuşma notu: Bölüm 2'deki aynı formül, yalnızca h = 4 ile.

Konuşma notu: Bölüm 4'teki formülü uygulayın.

Konuşma notu: Aynı formül, her zaman, ağacın boyutu ne olursa olsun.

Konuşma notu: Bölüm 5.5'teki yükseklik-ağırlıklı toplamı hatırlayın.

Konuşma notu: Üstteki az sayıda maliyetli sift, alttaki çok sayıda ucuz olanın altında eziliyor.

Konuşma notu: Neredeyse her işlemde neyin değiştiğini hatırlayın.

Konuşma notu: update_key, "bu belirli öğe"yi, o an nerede oturduğuna bağlı olmadan bulacak bir yola ihtiyaç duyar.

Konuşma notu: update_key tam olarak bunun için kuruldu: "en yakın öğeyi tekrar tekrar çıkar, sonra belki başka bir öğenin önceliğini düşür."

Konuşma notu: Bunlar, haftanın yazılı notlarının sonundaki aynı kaynaklar.

Konuşma notu: Tarihsel kaynaklar — Huffman, Williams, Floyd, Vuillemin, Cayley — bugünün "kısa tarihçe" slaytlarının dayandığı yer.