Menu
Coddy logo textTech

İkili Arama Ağacı (BST)

Son güncelleme

Bir ikili arama ağacı değerlerini sıralı tutar: her düğüm için sol alt ağaçtaki tüm değerler daha küçük, sağ alt ağaçtaki tüm değerler daha büyüktür. Bir değer eklemek veya bulmak için kökten başlar ve karşılaştırmaya göre tekrar tekrar sola ya da sağa gidersiniz, böylece her adım arama alanını yarıya indirir. Değerlerin karşılaştırmayla yerleştirilişini ve ağaçta aşağı inen bir aramayı izlemek için yukarıdaki oynat düğmesine basın.

Dengeli bir ağaçta bu işlemler O(log n) sürede çalışır. Sorun şu: zaten sıralı verileri eklemek ağacı O(n) işlemlerle çalışan bir bağlı listeye dönüştürür - AVL ve kırmızı-siyah ağaç gibi kendi kendini dengeleyen türlerin var olma sebebi tam olarak budur.

Zaman ve alan karmaşıklığı

İşlemDengeliEn kötü durum (dengesiz)
AramaO(log n)O(n)
EklemeO(log n)O(n)
SilmeO(log n)O(n)
AlanO(n)O(n)

Adım adım (ekleme)

AdımNe olur
1Ağaç boşsa, yeni değer kök olur.
2Aksi halde kökten başla.
3Değer küçükse sol çocuğa git; büyükse sağa git.
4Boş bir yere ulaşana kadar tekrarla.
5Yeni değeri oraya bir yaprak olarak ekle.

Çözümlü örnek

Boş bir ağaca [5, 3, 8, 1, 4] değerlerini birer birer ekleme:

Eklenenİzlenen yolİşlem
5-Ağaç boş, bu yüzden 5 kök olur.
353 < 5, sola git; yer boş, 35'in sol çocuğu olarak ekle.
858 > 5, sağa git; yer boş, 8'i 5'in sağ çocuğu olarak ekle.
15 -> 31 < 5 sola git, sonra 1 < 3 sola git; 1'i 3'ün sol çocuğu olarak ekle.
45 -> 34 < 5 sola git, sonra 4 > 3 sağa git; 43'ün sağ çocuğu olarak ekle.

İkili arama ağacını ne zaman kullanmalı

Şu durumda kullanŞu durumda kaçın
Sıralı düzen ve hızlı aramalara ihtiyacın var ve eklemeler rastgele sırada geliyor.Verilerin zaten sıralı geliyor: dengesiz bir BST işlem başına O(n)'e düşer.
Sıralı (in-order) dolaşmanın değerleri sıralı dizide bedavaya vermesini istiyorsun.Yalnızca üyelik testine ihtiyacın var ve sıra önemli değil: bir hash tablosu ortalama O(1) arama sunar.
Aralık sorgularına veya bir anahtarın ardılına/öncülüne ihtiyacın var.Garantili O(log n) sınırlarına ihtiyacın var: bunun yerine kendi kendini dengeleyen AVL veya kırmızı-siyah ağaca yönel.
Veri kümesi sık değişiyor ve statik bir sıralı diziyi güncellemek maliyetli olurdu.Veri kümesi sabit ve salt okunur: ikili aramalı sıralı bir dizi daha basit ve önbellek dostudur.

Binary Search Tree kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Binary Search Tree uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Binary Search Tree kodu

Python
1class Node:2    def __init__(self, key):3        self.key = key4        self.left = None5        self.right = None6
7
8def insert(node, key):9    if node is None:10        return Node(key)11    if key < node.key:12        node.left = insert(node.left, key)13    elif key > node.key:14        node.right = insert(node.right, key)15    return node  # duplicates are ignored16
17
18def search(node, key):19    if node is None:20        return False21    if key == node.key:22        return True23    if key < node.key:24        return search(node.left, key)25    return search(node.right, key)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.key] + inorder(node.right)32
33
34root = None35for key in [8, 3, 10, 1, 6, 14, 4, 7]:36    root = insert(root, key)37
38print("Inorder (sorted):", inorder(root))39print("search(6): ", search(root, 6))40print("search(5): ", search(root, 5))
Bu kodu Python Playground'da çalıştır

İkili Arama Ağacı SSS

İkili arama ağacının zaman karmaşıklığı nedir?
Arama, ekleme ve silme dengeli bir ağaçta O(log n)'dir, çünkü her karşılaştırma kalan düğümlerin yarısını eler. En kötü durumda - sıralı eklemelerle zincire dönüşmüş dengesiz bir ağaç - O(n)'e düşerler.
İkili ağaç ile ikili arama ağacı arasındaki fark nedir?
İkili ağaç, her düğümün en fazla iki çocuğu olduğu ve sıralama kuralı bulunmayan herhangi bir ağaçtır. İkili arama ağacı, sol alt ağaç değerlerinin daha küçük, sağ alt ağaç değerlerinin düğümden daha büyük olduğu değişmezi ekler; hızlı aramayı mümkün kılan da budur.
İkili arama ağacı neden yavaşlayabilir?
Değerler sıralı (veya ters sıralı) eklenirse, her yeni düğüm aynı tarafa gider ve bağlı liste gibi davranan uzun, dengesiz bir ağaç oluşur: işlem başına O(n). Kendi kendini dengeleyen ağaçlar (AVL, kırmızı-siyah) bunu önlemek için düğümleri döndürür.
İkili arama ağacı ile hash tablosu arasındaki fark nedir?
Bir hash tablosu ortalama O(1) arama sunar ama anahtarları hiçbir sırada tutmaz, bu yüzden aralık veya ardıl sorgularını yanıtlayamaz. İkili arama ağacı O(log n) ile biraz daha yavaştır ama anahtarları sıralı tutar; bu da onları sıralı dolaşmanı ve en yakın değerleri bulmanı sağlar. Sıra önemliyse BST'yi, yalnızca üyelik testine ihtiyacın varsa hash tablosunu seç.
Düz bir BST yerine ne zaman kendi kendini dengeleyen ağaç kullanmalıyım?
Ekleme sırasını kontrol edemediğinde ve garantili O(log n) performansa ihtiyacın olduğunda kendi kendini dengeleyen bir ağaç (AVL, kırmızı-siyah) kullan. Düz bir BST öğretim için, küçük veri kümeleri için veya anahtarlar rastgele sırada geldiğinde uygundur ama dengesiz en kötü duruma karşı koruma sağlamaz.
Bir BST'nin sıralı (in-order) dolaşması sıralı değerler döndürür mü?
Evet. Önce sol alt ağacı, sonra düğümü, ardından sağ alt ağacı ziyaret etmek anahtarları artan sırada verir; bu doğrudan BST değişmezinden gelir. Yaygın bir hata, aynısını düz bir ikili ağaçtan beklemektir: sıralama kuralı olmadan sıralı dolaşma anlamlı bir dizi üretmez.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA