İkili arama ağacı - Vikipedi
İçeriğe atla
Ana menü
Gezinti
  • Anasayfa
  • Hakkımızda
  • İçindekiler
  • Rastgele madde
  • Seçkin içerik
  • Yakınımdakiler
Katılım
  • Deneme tahtası
  • Köy çeşmesi
  • Son değişiklikler
  • Dosya yükle
  • Topluluk portalı
  • Wikimedia dükkânı
  • Yardım
  • Özel sayfalar
Vikipedi Özgür Ansiklopedi
Ara
  • Bağış yapın
  • Hesap oluştur
  • Oturum aç
  • Bağış yapın
  • Hesap oluştur
  • Oturum aç

İçindekiler

  • Giriş
  • 1 İşlemler
    • 1.1 Arama
    • 1.2 Ekleme
    • 1.3 Silme
  • 2 Dengeli ikili arama ağaçları

İkili arama ağacı

  • العربية
  • Български
  • Bosanski
  • Català
  • Čeština
  • Dansk
  • Deutsch
  • English
  • Español
  • فارسی
  • Suomi
  • Français
  • עברית
  • हिन्दी
  • Հայերեն
  • Bahasa Indonesia
  • İtaliano
  • 日本語
  • Taqbaylit
  • ಕನ್ನಡ
  • 한국어
  • Lombard
  • Nederlands
  • Polski
  • Português
  • Română
  • Русский
  • Srpskohrvatski / српскохрватски
  • Slovenčina
  • Српски / srpski
  • Svenska
  • ไทย
  • Українська
  • Tiếng Việt
  • 中文
  • 粵語
Bağlantıları değiştir
  • Madde
  • Tartışma
  • Oku
  • Değiştir
  • Kaynağı değiştir
  • Geçmişi gör
Araçlar
Eylemler
  • Oku
  • Değiştir
  • Kaynağı değiştir
  • Geçmişi gör
Genel
  • Sayfaya bağlantılar
  • İlgili değişiklikler
  • Kalıcı bağlantı
  • Sayfa bilgisi
  • Bu sayfayı kaynak göster
  • Kısaltılmış URL'yi al
  • Karekodu indir
Yazdır/dışa aktar
  • Bir kitap oluştur
  • PDF olarak indir
  • Basılmaya uygun görünüm
Diğer projelerde
  • Wikimedia Commons
  • Vikiveri ögesi
Görünüm
Vikipedi, özgür ansiklopedi
Bu madde hiçbir kaynak içermemektedir. Lütfen güvenilir kaynaklar ekleyerek madde içeriğinin geliştirilmesine yardımcı olun. Kaynaksız içerik itiraz konusu olabilir ve kaldırılabilir.
Kaynak ara: "İkili arama ağacı" – haber · gazete · kitap · akademik · JSTOR
(Temmuz 2024) (Bu şablonun nasıl ve ne zaman kaldırılması gerektiğini öğrenin)

İkili arama ağacı, verileri organize etmek için kullanılan bir çeşit ikili ağaçtır. İkili ağaçtan temel farkı, verilerin sıralanmış bir şekilde tutulmasıdır, bu sayede ikili arama algoritmasının kullanılmasına imkân verir.

9 elemanlı, yüksekliği 4 ve kökü 8 olan bir ikili arama ağacı

İkili arama ağaçlarında; her düğümün sağ çocuğu kendisinden büyük, sol çocuğu ise kendisinden küçüktür. Bu ağaçlarda çalışan arama algoritması önce kökten başlar, eğer aranan eleman kökten büyükse sağ çocuğa, kökten küçükse sol çocuğa ilerler. Böylece, eleman bulunana yapraklara kadar yinelemeli bir şekilde ilerleme sağlanır.

İşlemler

[değiştir | kaynağı değiştir]

İkili arama ağacı üzerinde; arama, ekleme, silme işlemleri yapılabilir.

Arama

[değiştir | kaynağı değiştir]

Kökten başlanarak arama işlemi yapılır. Eğer aranan eleman o anki düğümden büyükse sağa, küçükse sola ilerlenir. Bu algoritma bir döngü içinde ya da özyinelemeli şekilde uygulanabilir. Python kodu şu şekildedir:

def search_recursively(key, node):
    if node is None or node.key == key:
        return node
    if key < node.key:
        return search_recursively(key, node.left)
    # key > node.key
    return search_recursively(key, node.right)
def search_iteratively(key, node): 
    current_node = node
    while current_node is not None:
        if key == current_node.key:
            return current_node
        elif key < current_node.key:
            current_node = current_node.left
        else: # key > current_node.key:
            current_node = current_node.right
    return current_node

Ekleme

[değiştir | kaynağı değiştir]

Eleman ekleme işlemi her zaman yapraklara ya da tek çocuğu olan düğümlere yapılır. Bunun için öncelikle eklenecek elemanın konumu bulunmalıdır, konum bulma işlemi arama kısmında olduğu gibi büyükse sağa, küçükse sola ilerle şeklinde yapılır. Bu algoritma da bir döngü içinde ya da özyinelemeli şekilde uygulanabilir. C++ kodu şu şekildedir:

Node* insert(Node*& root, int key, int value) {
  if (!root) 
    root = new Node(key, value);
  else if (key < root->key)
    root->left = insert(root->left, key, value);
  else  // key >= root->key
    root->right = insert(root->right, key, value);
  return root;

Silme

[değiştir | kaynağı değiştir]
İki çocuğu olan bir düğümün (D) silinmesi. D, E ile yer değiştirilip siliniyor.

Silme işlemi üç başlık altında incelenebilir. Eğer,

  • Silinecek düğümün çocuğu yoksa: basitçe düğüm silinir.
  • Silinecek düğümün tek çocuğu varsa: düğüm silinir ve tek çocuk silinen düğümün yerine taşınır.
  • Silinecek düğümün iki çocuğu varsa: silinecek düğüme D diyelim, D'yi silmeden önce D'den büyük en küçük eleman bulunur (inorder successor) buna da E diyelim. E ile D yer değiştirilir ve ardından D silinir.

Bir elemandan büyük en küçük eleman, o elemanın sağ alt ağacının en solundaki elemandır ve bunu bulmak için ekstra metot yazmak gerekir. Bu yüzden, silme algoritması ekleme ve arama algoritmalarına göre daha uzundur. Python kodu şu şekildedir:

def find_min(self):   # Gets minimum node in a subtree
    current_node = self
    while current_node.left_child:
        current_node = current_node.left_child
    return current_node

def replace_node_in_parent(self, new_value=None):
    if self.parent:
        if self == self.parent.left_child:
            self.parent.left_child = new_value
        else:
            self.parent.right_child = new_value
    if new_value:
        new_value.parent = self.parent

def binary_tree_delete(self, key):
    if key < self.key:
        self.left_child.binary_tree_delete(key)
    elif key > self.key:
        self.right_child.binary_tree_delete(key)
    else: # delete the key here
        if self.left_child and self.right_child: # if both children are present
            successor = self.right_child.find_min()
            self.key = successor.key
            successor.binary_tree_delete(successor.key)
        elif self.left_child:   # if the node has only a *left* child
            self.replace_node_in_parent(self.left_child)
        elif self.right_child:  # if the node has only a *right* child
            self.replace_node_in_parent(self.right_child)
        else: # this node has no children
            self.replace_node_in_parent(None)

Dengeli ikili arama ağaçları

[değiştir | kaynağı değiştir]

Bir ağaçtaki tüm düğümlerin sağ alt ağaçları ve sol alt ağaçları arasındaki yükseklik farkı en fazla 1 ise, o ağaç dengeli olarak tanımlanır. Ağaçların dengeli olması onların yüksekliğini azaltarak ağaç üzerinde çalışan algoritmaların performansını arttırır. Örneğin boş bir ikili arama ağacına 1, 2, 3, 4, 5, 6, 7 elemanlarını sırayla eklediğimizi düşünelim. Bu durumda elemanlar hep sağ tarafa ekleneceği için ağaç esasen bir bağlı listeye dönüşür. Halbuki, aynı elemanlar, yüksekliği 3 olan bir ağaca da yerleştirilebilirlerdi. Bu durum, dengeli ikili arama ağaçlarının icadına yol açmıştır. AVL ağacı, 2-3-4 ağacı ve kırmızı-siyah ağaçlar dengeli ağaçlara örnektir.

  • g
  • t
  • d
Veri yapıları
Türler
Kapsayıcı · Koleksiyon
Soyut
Liste · İlişkisel dizi · Çoklu harita · Küme · Çoklu küme · Çift uçlu kuyruk · Kuyruk · Öncelik kuyruğu · Yığın
Diziler
Dinamik dizi · Seyrek dizi · Dairesel arabellek · Bit dizisi · Komut çizelgesi
Bağlı
Bağlı liste · Açılmış bağlı liste · XOR bağlı liste · Atlama listesi
Ağaçlar
B-ağaç · Ağaç sıralaması (kendini dengeleyen: AA, AVL, kırmızı-siyah, şevli) · Öbek (ikili, binom, Fibonacci) · Önek ağacı
Çizgeler
Yönlendirilmiş çizge · Yönlendirilmiş asiklik çizge · İkili karar diyagramı · Hiperçizge
Veri yapıları listesi
"https://tr.wikipedia.org/w/index.php?title=İkili_arama_ağacı&oldid=33564627" sayfasından alınmıştır
Kategoriler:
  • İkili ağaçlar
  • Veri tipleri
  • Arama ağaçları
Gizli kategori:
  • Kaynakları olmayan maddeler Temmuz 2024
  • Sayfa en son 21.48, 27 Temmuz 2024 tarihinde değiştirildi.
  • Metin Creative Commons Atıf-AynıLisanslaPaylaş Lisansı altındadır ve ek koşullar uygulanabilir. Bu siteyi kullanarak Kullanım Şartlarını ve Gizlilik Politikasını kabul etmiş olursunuz.
    Vikipedi® (ve Wikipedia®) kâr amacı gütmeyen kuruluş olan Wikimedia Foundation, Inc. tescilli markasıdır.
  • Gizlilik politikası
  • Vikipedi hakkında
  • Sorumluluk reddi
  • Davranış Kuralları
  • Geliştiriciler
  • İstatistikler
  • Çerez politikası
  • Mobil görünüm
  • Wikimedia Foundation
  • Powered by MediaWiki
İkili arama ağacı
Konu ekle