Menu
Coddy logo textTech

İkili Ağaç

Son güncelleme

İkili ağaç, her düğümün en fazla iki çocuğa (sol ve sağ çocuk) sahip olduğu bir hiyerarşidir. En üstteki düğüm köktür, çocuğu olmayan düğümler yapraktır ve kökten en derin yaprağa kadar olan kenar sayısı ağacın yüksekliğidir. İkili arama ağacının aksine, sade bir ikili ağacın sıralama kuralı yoktur; yalnızca biçimdir. Bir ağacın seviye seviye dolmasını ve ardından in-order (sol, düğüm, sağ) gezilmesini izlemek için yukarıdan oynat'a basın.

İkili ağaçlar birçok yapının temelini oluşturur: ikili arama ağaçları, yığınlar, ifade ağaçları ve daha fazlası. Gezinmeler her düğümü tanımlı bir sırada ziyaret eder: in-order, pre-order ve post-order üç derinlik öncelikli gezinmedir ve her biri farklı görevler için yararlıdır.

Terminoloji

TerimAnlamı
KökEbeveyni olmayan en üst düğüm
YaprakÇocuğu olmayan bir düğüm
YükseklikEn uzun kök-yaprak yolu (kenar cinsinden)
DerinlikBir düğümün köke olan uzaklığı
Tam (complete)Son seviye hariç tüm seviyeler dolu, son seviye soldan sağa doldurulur

Üç derinlik öncelikli gezinme

GezinmeSıraYaygın kullanım
In-orderSol, düğüm, sağBir BST'nin sıralı çıktısı
Pre-orderDüğüm, sol, sağAğacı kopyala / serileştir
Post-orderSol, sağ, düğümAğacı sil / değerlendir

Çözümlü örnek

[4, 2, 6, 1, 3, 5] değerlerinden kurulan (seviye seviye dolduran) ağacın in-order gezinmesi:

AdımDüğümdeEylem
144 ziyaret edilmeden önce sol alt ağacına özyinelenir
222 ziyaret edilmeden önce sol alt ağacına özyinelenir
31Yaprak, sol çocuk yok: 1 ziyaret edilir, çıktı [1]
42Sol tamamlandı: 2 ziyaret edilir, çıktı [1, 2], ardından sağa özyinelenir
53Yaprak: 3 ziyaret edilir, çıktı [1, 2, 3]
64Sol alt ağaç tamamlandı: 4 ziyaret edilir, çıktı [1, 2, 3, 4], ardından sağa özyinelenir
756'nın sol çocuğu, bir yaprak: 5 ziyaret edilir, çıktı [1, 2, 3, 4, 5]
86Sol tamamlandı, sağ çocuk yok: 6 ziyaret edilir, çıktı [1, 2, 3, 4, 5, 6]

İkili ağaç ne zaman kullanılır

Şu durumlarda kullanınŞu durumlarda kaçının
Doğası gereği hiyerarşik verileri modellemeniz gerektiğinde (dosya sistemleri, ifade ağaçları, DOM)Veri düz olduğunda ve bir liste ya da dizi yeterli olduğunda: ağaç yalnızca ek yük getirir
Sıralı işlemler istediğinizde ve dengeli tutabildiğinizde (bir BST veya kendini dengeleyen ağaç)Anahtara göre ortalama O(1) aramaya ihtiyaç duyduğunuzda: bir karma tablo her ağacı geride bırakır
Yapılandırılmış veriyi in-order, pre-order veya post-order işlemeniz gerektiğindeDüğümler dengesiz bir BST'ye sıralı biçimde eklendiğinde: O(n) bir listeye dönüşür
Aralık sorguları veya sıralı yineleme önemli olduğunda; karma tablolar bunu sağlayamazBellek kısıtlı olduğunda: her düğüm veriye ek olarak iki çocuk işaretçisi taşır

Binary Tree kodu

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

Python ile Binary Tree kodu

Python
1from collections import deque2
3
4class Node:5    def __init__(self, value):6        self.value = value7        self.left = None8        self.right = None9
10
11def insert(root, value):12    # Level-order insert: fill the first empty child slot found13    if root is None:14        return Node(value)15    queue = deque([root])16    while queue:17        node = queue.popleft()18        if node.left is None:19            node.left = Node(value)20            return root21        queue.append(node.left)22        if node.right is None:23            node.right = Node(value)24            return root25        queue.append(node.right)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.value] + inorder(node.right)32
33
34root = None35for value in [1, 2, 3, 4, 5, 6, 7]:36    root = insert(root, value)37
38print("Root:   ", root.value)39print("Inorder:", inorder(root))
Bu kodu Python Playground'da çalıştır

İkili Ağaç SSS

İkili ağaç ile ikili arama ağacı arasındaki fark nedir?
İkili ağaç yalnızca her düğümü en fazla iki çocukla sınırlar, herhangi bir sıralama yoktur. İkili arama ağacı, sol alt ağaçtaki her şeyin daha küçük, sağ alt ağaçtaki her şeyin daha büyük olduğu kuralını ekler; aramayı hızlı yapan da budur.
In-order gezinme nedir?
In-order gezinme, özyinelemeli olarak önce sol alt ağacı, sonra düğümü, sonra sağ alt ağacı ziyaret eder. Bir ikili arama ağacı için bu, değerleri artan sırada üretir; bu yüzden göstermek için en yaygın gezinmedir.
Tam (complete) ikili ağaç nedir?
Tam bir ikili ağaçta, son seviye dışındaki tüm seviyeler tamamen doludur ve son seviye soldan sağa doldurulur. Bu biçim, ağacın bir dizide (çocuk işaretçilerine gerek olmadan) kompakt biçimde saklanmasını sağlar; ikili yığınlar da böyle uygulanır.
Bir dizi veya karma tablo yerine ne zaman ikili ağaç kullanmalıyım?
Verileriniz doğal olarak hiyerarşik olduğunda veya aralık sorguları ile sıralı yineleme gibi sıralı işlemlere ihtiyaç duyduğunuzda (karma tabloların sağlayamadığı şeyler) bir ağaca başvurun. Yalnızca sıralama olmadan anahtara göre hızlı aramaya ihtiyacınız varsa, karma tablonun ortalama O(1) erişimi bir ağacı geride bırakır; düz veriler içinse bir dizi daha basit ve önbelleğe daha uygundur.
İkili ağacın yüksekliği ile derinliği arasındaki fark nedir?
Derinlik, kökten aşağıya belirli bir düğüme kadar ölçülür: kökten o düğüme giden yoldaki kenar sayısıdır. Yükseklik, bir düğümden aşağıya en derin yaprağına kadar ölçülür, dolayısıyla tüm ağacın yüksekliği en derin düğümünün derinliğidir. Tek düğümlü bir ağacın yüksekliği 0'dır ve tek düğümünün derinliği de 0'dır.
Dengesiz bir ikili ağaç neden bu kadar kötü performans gösterir?
İkili arama ağacında arama, ekleme ve silme, h yükseklik olmak üzere O(h) maliyetlidir. Anahtarlar sıralı biçimde eklendiğinde ağaç düz bir çizgiye dönüşür, böylece h n'e kadar büyür ve her işlem O(n)'e düşer; bağlı listeden farksız. AVL veya kırmızı-siyah gibi kendini dengeleyen ağaçlar bunu önlemek için yüksekliği O(log n) düzeyinde tutar.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA