Ağacın Tüm Elemanlarını Ziyaret Etme Yöntemleri
Tüm traversal örneklerinde bu ağacı kullanacağız:
50
/ \
30 70
/ \ / \
20 40 60 80
LNR: Left → Node → Right
Sonuç:
✨ BST için inorder = SIRALI çıktı! (Küçükten büyüğe)
NLR: Node → Left → Right
Sonuç:
✨ Kök her zaman İLK! Ağacı kopyalamak/serialize etmek için ideal.
LRN: Left → Right → Node
Sonuç:
✨ Kök her zaman SON! Ağacı silmek için ideal (önce çocukları sil).
Seviye seviye, soldan sağa
Sonuç:
✨ Her seviye sırayla! En kısa yol bulma, seviye sayma için ideal.
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")