Veri Yapısı ve Algoritmalar - Ağaç

Ağaç, kenarlarla bağlanan düğümleri temsil eder. Özellikle ikili ağaç veya ikili arama ağacını tartışacağız.

Binary Tree, veri depolama amacıyla kullanılan özel bir veri yapısıdır. İkili ağacın, her düğümün en fazla iki çocuğa sahip olabileceği özel bir koşulu vardır. Arama sıralı bir dizide olduğu kadar hızlı olduğundan ve ekleme veya silme işlemi bağlantılı listedeki kadar hızlı olduğundan, ikili ağaç hem sıralı bir dizinin hem de bağlantılı bir listenin avantajlarına sahiptir.

Önemli Terimler

Ağaçla ilgili önemli terimler aşağıdadır.

  • Path - Yol, bir ağacın kenarları boyunca düğüm dizisini ifade eder.

  • Root- Ağacın tepesindeki düğüme kök denir. Ağaç başına yalnızca bir kök ve kök düğümden herhangi bir düğüme giden bir yol vardır.

  • Parent - Kök düğüm dışındaki herhangi bir düğümün üst adı verilen düğüme yukarı doğru bir kenarı vardır.

  • Child - Belirli bir düğümün altındaki düğüme, kenarı aşağı doğru bağlanan düğüm, alt düğümü olarak adlandırılır.

  • Leaf - Herhangi bir alt düğüme sahip olmayan düğüme yaprak düğüm denir.

  • Subtree - Alt ağaç, bir düğümün soyundan gelenleri temsil eder.

  • Visiting - Ziyaret, kontrol düğüm üzerindeyken bir düğümün değerinin kontrol edilmesidir.

  • Traversing - Geçiş, belirli bir sırayla düğümlerden geçmek anlamına gelir.

  • Levels- Bir düğümün seviyesi, bir düğümün oluşumunu temsil eder. Kök düğüm 0 düzeyindeyse, sonraki alt düğümü düzey 1, torunu düzey 2, vb.

  • keys - Anahtar, bir düğüm için bir arama işleminin gerçekleştirileceği bir düğümün değerini temsil eder.

İkili Arama Ağacı Gösterimi

İkili Arama ağacı özel bir davranış sergiler. Bir düğümün sol çocuğu, ebeveyninin değerinden daha küçük bir değere sahip olmalı ve düğümün sağ çocuğu, ebeveyn değerinden daha büyük bir değere sahip olmalıdır.

Düğüm nesnesini kullanarak ve bunları referanslar yoluyla birbirine bağlayarak ağacı gerçekleştireceğiz.

Ağaç Düğümü

Bir ağaç düğümü yazma kodu aşağıda verilene benzer olacaktır. Bir veri bölümüne ve sol ve sağ alt düğümlerine referanslara sahiptir.

struct node {
   int data;   
   struct node *leftChild;
   struct node *rightChild;
};

Bir ağaçta, tüm düğümler ortak bir yapı paylaşır.

BST Temel İşlemleri

İkili arama ağacı veri yapısında gerçekleştirilebilecek temel işlemler şunlardır -

  • Insert - Ağaca bir öğe ekler / bir ağaç oluşturur.

  • Search - Ağaçtaki bir öğeyi arar.

  • Preorder Traversal - Bir ağacı önceden sırayla gezer.

  • Inorder Traversal - Bir ağacı sırayla gezer.

  • Postorder Traversal - Sipariş sonrası bir şekilde bir ağaçtan geçer.

Bu bölümde bir ağaç yapısı oluşturmayı (içine eklemeyi) ve ağaçtaki bir veri öğesini aramayı öğreneceğiz. İlerleyen bölümde ağaç dolaşma yöntemlerini öğreneceğiz.

İşlem Ekle

İlk yerleştirme ağacı oluşturur. Daha sonra, bir eleman ne zaman eklenecekse, önce uygun yerini bulun. Kök düğümden aramaya başlayın, ardından veri anahtar değerinden düşükse, sol alt ağaçta boş konumu arayın ve verileri ekleyin. Aksi takdirde, sağ alt ağaçta boş konumu arayın ve verileri ekleyin.

Algoritma

If root is NULL 
   then create root node
return

If root exists then
   compare the data with node.data
   
   while until insertion position is located

      If data is greater than node.data
         goto right subtree
      else
         goto left subtree

   endwhile 
   
   insert data
	
end If

Uygulama

Ekleme işlevinin uygulanması şu şekilde görünmelidir -

void insert(int data) {
   struct node *tempNode = (struct node*) malloc(sizeof(struct node));
   struct node *current;
   struct node *parent;

   tempNode->data = data;
   tempNode->leftChild = NULL;
   tempNode->rightChild = NULL;

   //if tree is empty, create root node
   if(root == NULL) {
      root = tempNode;
   } else {
      current = root;
      parent  = NULL;

      while(1) {                
         parent = current;

         //go to left of the tree
         if(data < parent->data) {
            current = current->leftChild;                
            
            //insert to the left
            if(current == NULL) {
               parent->leftChild = tempNode;
               return;
            }
         }
			
         //go to right of the tree
         else {
            current = current->rightChild;
            
            //insert to the right
            if(current == NULL) {
               parent->rightChild = tempNode;
               return;
            }
         }
      }            
   }
}

Arama İşlemi

Bir eleman aranacağı zaman, kök düğümden aramaya başlayın, ardından veri anahtar değerinden düşükse, sol alt ağaçta elemanı arayın. Aksi takdirde, sağ alt ağaçta öğeyi arayın. Her düğüm için aynı algoritmayı izleyin.

Algoritma

If root.data is equal to search.data
   return root
else
   while data not found

      If data is greater than node.data
         goto right subtree
      else
         goto left subtree
         
      If data found
         return node
   endwhile 
   
   return data not found
   
end if

Bu algoritmanın uygulaması şöyle görünmelidir.

struct node* search(int data) {
   struct node *current = root;
   printf("Visiting elements: ");

   while(current->data != data) {
      if(current != NULL)
      printf("%d ",current->data); 
      
      //go to left tree

      if(current->data > data) {
         current = current->leftChild;
      }
      //else go to right tree
      else {                
         current = current->rightChild;
      }

      //not found
      if(current == NULL) {
         return NULL;
      }

      return current;
   }  
}

İkili arama ağacı veri yapısının uygulanmasını öğrenmek için lütfen buraya tıklayın .