🚶 5.3: BST Dolaşma (Traversal)

Ağacın Tüm Elemanlarını Ziyaret Etme Yöntemleri

🎯 Örnek Ağaç

Tüm traversal örneklerinde bu ağacı kullanacağız:

        50
       /  \
     30    70
    / \   /  \
   20  40 60  80
            
📋

Inorder (Sol-Kök-Sağ)

LNR: Left → Node → Right

Algoritma:
1. Sol alt ağacı ziyaret et
2. Kökü ziyaret et (işle)
3. Sağ alt ağacı ziyaret et

Sonuç:

20 30 40 50 60 70 80

✨ BST için inorder = SIRALI çıktı! (Küçükten büyüğe)

📊
Sıralı Liste
🔍
BST Doğrulama
📈
k'ıncı En Küçük
📦

Preorder (Kök-Sol-Sağ)

NLR: Node → Left → Right

Algoritma:
1. Kökü ziyaret et (işle)
2. Sol alt ağacı ziyaret et
3. Sağ alt ağacı ziyaret et

Sonuç:

50 30 20 40 70 60 80

✨ Kök her zaman İLK! Ağacı kopyalamak/serialize etmek için ideal.

💾
Ağaç Kopyalama
📁
Dosya Sistemi
🔗
Serileştirme
🗑️

Postorder (Sol-Sağ-Kök)

LRN: Left → Right → Node

Algoritma:
1. Sol alt ağacı ziyaret et
2. Sağ alt ağacı ziyaret et
3. Kökü ziyaret et (işle)

Sonuç:

20 40 30 60 80 70 50

✨ Kök her zaman SON! Ağacı silmek için ideal (önce çocukları sil).

🗑️
Ağaç Silme
🧮
İfade Değerlendirme
📐
Boyut Hesaplama
📊

Level Order (BFS)

Seviye seviye, soldan sağa

Algoritma (Queue kullanarak):
1. Kökü queue'ya ekle
2. Queue boş olana kadar:
   - Queue'dan çıkar ve işle
   - Çocuklarını queue'ya ekle

Sonuç:

50 | 30 70 | 20 40 60 80

✨ Her seviye sırayla! En kısa yol bulma, seviye sayma için ideal.

🗺️
En Kısa Yol
📏
Derinlik Bulma
🖨️
Seviye Yazdırma

💻 Python Implementasyonu

Tüm Traversal Metodları
from collections import deque

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

class BST:
    def __init__(self):
        self.root = None

    def insert(self, data):
        if not self.root:
            self.root = Node(data)
            return
        c = self.root
        while True:
            if data < c.data:
                if not c.left: c.left = Node(data); return
                c = c.left
            else:
                if not c.right: c.right = Node(data); return
                c = c.right

    # ===== TRAVERSAL METODLARI =====

    def inorder(self, node=None, result=None):
        """Sol → Kök → Sağ (Sıralı çıktı)"""
        if result is None: result = []
        if node is None: node = self.root

        if node:
            self.inorder(node.left, result)   # Sol
            result.append(node.data)           # Kök
            self.inorder(node.right, result)  # Sağ
        return result

    def preorder(self, node=None, result=None):
        """Kök → Sol → Sağ"""
        if result is None: result = []
        if node is None: node = self.root

        if node:
            result.append(node.data)           # Kök
            self.preorder(node.left, result)  # Sol
            self.preorder(node.right, result) # Sağ
        return result

    def postorder(self, node=None, result=None):
        """Sol → Sağ → Kök"""
        if result is None: result = []
        if node is None: node = self.root

        if node:
            self.postorder(node.left, result)  # Sol
            self.postorder(node.right, result) # Sağ
            result.append(node.data)            # Kök
        return result

    def level_order(self):
        """BFS ile seviye seviye dolaşma"""
        if not self.root:
            return []

        result = []
        queue = deque([self.root])

        while queue:
            node = queue.popleft()  # FIFO
            result.append(node.data)

            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)

        return result

# Test
bst = BST()
for v in [50, 30, 70, 20, 40, 60, 80]:
    bst.insert(v)

print("🌳 Ağaç: 50 → (30, 70) → (20, 40, 60, 80)")
print()
print("=" * 50)
print("📋 TRAVERSAL SONUÇLARI")
print("=" * 50)
print()
print(f"📋 Inorder  (LNR): {bst.inorder()}")
print(f"   → Sıralı çıktı verir!")
print()
print(f"📦 Preorder (NLR): {bst.preorder()}")
print(f"   → Kök başta, kopyalama için")
print()
print(f"🗑️ Postorder(LRN): {bst.postorder()}")
print(f"   → Kök sonda, silme için")
print()
print(f"📊 Level Order:    {bst.level_order()}")
print(f"   → Seviye seviye, BFS")
Çıktı bekleniyor...

📊 Özet Tablosu

Traversal Sıra Özellik Kullanım
Inorder Sol → Kök → Sağ BST'de sıralı çıktı Sıralama, doğrulama
Preorder Kök → Sol → Sağ Kök ilk Kopyalama, serialize
Postorder Sol → Sağ → Kök Kök son Silme, ifade değerlendirme
Level Order Seviye seviye BFS, Queue kullanır En kısa yol, seviye işlemleri