İ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ç.

#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

$ binary_search-tree --interactive

Bir değer yaz ve ekle ya da ara. Her düğümde küçükler sola, büyükler sağa gider.

Eleman: 7/12GeziliyorYeniÇıkarılıyorBulundu / okunan

#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

İşlemSü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ükO(h)
Inorder gezintiO(n)
BellekO(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

1/3

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

Orta

1/1

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

1/1

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: