İkili Arama Ağacı (BST)
Küçük değerleri sola, büyükleri sağa yerleştirerek hızlı arama ve sıralı gezinti sağlayan ağaç.
Önce bunlara göz at
#Nasıl çalışır?
İkili arama ağacı (BST), her düğümün en fazla iki çocuğu olan bir ağaçtır. Kuralı basittir: bir düğümün sol alt ağacındaki tüm değerler ondan küçük, sağ alt ağacındakiler ondan büyüktür.
Bu kural sayesinde arama, ikili aramaya benzer: kökten başlanır, aranan değer küçükse sola, büyükse sağa inilir. Her adımda ağacın bir yarısı elenir.
Ağacı inorder (sol, düğüm, sağ) sırasıyla gezmek değerleri küçükten büyüğe verir. BST bu yüzden hem hızlı arama hem de sıralı veri sağlar.
#Kendin dene
Bir değer yaz ve ekle ya da ara. Her düğümde küçükler sola, büyükler sağa gider.
#Temel işlemler
- insert(x)
- Kökten başlayıp küçükse sola, büyükse sağa inerek boş bir yere yeni yaprak ekler.
- search(x)
- Aynı yolu izler; değeri bulur ya da boş bir dala ulaşır.
- remove(x)
- Yaprak doğrudan silinir; tek çocuklu düğümün yerine çocuğu geçer; iki çocuklu düğümün yerine sağ alt ağacın en küçüğü (ardıl) yazılır.
- inorder
- Sol alt ağaç, düğüm, sağ alt ağaç sırasıyla gezer; değerler sıralı gelir.
#Örnek kod
Aynı algoritma 8 dilde. Her program derlenip çalıştırılarak test edildi ve hepsi aynı çıktıyı veriyor.
from __future__ import annotations
from dataclasses import dataclass
@dataclass
class Node:
value: int
left: Node | None = None
right: Node | None = None
def insert(node: Node | None, value: int) -> Node:
if node is None:
return Node(value)
if value < node.value:
node.left = insert(node.left, value)
elif value > node.value:
node.right = insert(node.right, value)
return node # duplicates are ignored
def contains(node: Node | None, value: int) -> bool:
while node is not None:
if value == node.value:
return True
node = node.left if value < node.value else node.right
return False
def remove(node: Node | None, value: int) -> Node | None:
if node is None:
return None
if value < node.value:
node.left = remove(node.left, value)
elif value > node.value:
node.right = remove(node.right, value)
elif node.left and node.right:
# Two children: copy the in-order successor, then remove it from the right subtree.
succ = node.right
while succ.left:
succ = succ.left
node.value = succ.value
node.right = remove(node.right, succ.value)
else:
# Zero or one child: the child (or None) takes this node's place.
return node.left or node.right
return node
def inorder(node: Node | None) -> list[int]:
if node is None:
return []
return inorder(node.left) + [node.value] + inorder(node.right)
root = None
for v in (50, 30, 70, 20, 40, 60, 80):
root = insert(root, v)
print(*inorder(root)) # sorted order
print(str(contains(root, 60)).lower())
root = remove(root, 50) # the root has two children
print(*inorder(root))#Karmaşıklık
| İşlem | Süre |
|---|---|
| Arama / ekleme / silme (dengeli ağaç) | O(log n) |
| Arama / ekleme / silme (en kötü, dengesiz) | O(n) |
| En küçük / en büyük | O(h) |
| Inorder gezinti | O(n) |
| Bellek | O(n) |
Tüm işlemler ağacın yüksekliği (h) kadar sürer. Dengeli bir ağaçta h ≈ log₂ n'dir. Ama değerler sıralı eklenirse (1, 2, 3, ...) her düğüm sağa eklenir, ağaç bir listeye dönüşür ve h = n olur. AVL ve kırmızı-siyah ağaçlar kendini dengeleyerek O(log n) garantisi verir. Denemek için 10, 20, 30, 40'ı sırayla ekle.
#Ne zaman kullanılır?
Sıralı tutulması gereken ve sık eklenip silinen veriler için uygundur: sıralı kümeler ve sözlükler (Java TreeMap, C++ std::map kırmızı-siyah ağaç kullanır), aralık sorguları ("30 ile 60 arasındakiler"), en yakın küçük/büyük değeri bulma. Veritabanı indeksleri bunun disk dostu hali olan B-ağaçlarını kullanır.
#Alıştırma
Soruları cevaplamak ve ilerlemeni kaydetmek için giriş yap.
Kolay
BST'de bir düğümün sol alt ağacındaki değerler için ne söylenebilir?
- 1Hepsi düğümden küçüktür
- 2Hepsi düğümden büyüktür
- 3Rastgeledir
- 4Hepsi eşittir
BST'yi inorder (sol, düğüm, sağ) gezmek değerleri nasıl verir?
- 1Küçükten büyüğe sıralı
- 2Büyükten küçüğe
- 3Eklenme sırasıyla
- 4Seviye seviye
Dengeli bir BST'de arama hangi karmaşıklıktadır?
- 1O(log n)
- 2O(1)
- 3O(n)
- 4O(n²)
Orta
Boş bir BST'ye sırasıyla 50, 30, 70, 40 eklenirse 40 kimin çocuğu olur?
- 130'un sağ çocuğu
- 270'in sol çocuğu
- 350'nin sol çocuğu
- 430'un sol çocuğu
Zor
Boş bir BST'ye 1, 2, 3, 4, 5 sırayla eklenirse arama hangi karmaşıklığa düşer?
- 1O(n), ağaç bir listeye dönüşür
- 2O(log n), ağaç dengeli kalır
- 3O(1)
- 4O(n log n)
#Bundan sonra
Bu dersi bildiğini varsayan dersler: