İkili Arama Ağacı Silme İşlemi C Kodu - (BST Deletion)

Bir önceki yazımızda ikili arama ağacı eleman ekleme işlemini görmüştük. Bu yazımızda direkt olarak üzerinde deneme yapabileceğiniz hazır C fonksiyonu paylaşıyorum. Fonksiyonlar halinde yazılmış tertemiz bir kod parçasıdır. Main fonksiyonu dinamik değil, siz istediğiniz gibi dinamik yapabilirsiniz. Dilerseniz bir önceki konumuzdaki insertion fonksiyonunu buraya ekleyebilirsiniz. Hatta ikili arama ağacı arama işlemi konumuzdaki fonksiyonu da ekleyebilirsiniz. Ben fazla karıştırmamak için eklemedim.




// **************** Algoritma Uzmanı **************** //
// *************www Algoritma Uzmanı com************* //

#include<stdio.h>
#include<stdlib.h>
 
struct node
{
    int key;
    struct node *left, *right;
};
 
// Ağaç Düğümü oluşturan fonksiyon
struct node *newNode(int item)
{
    struct node *temp =  (struct node *)malloc(sizeof(struct node));
    temp->key = item;
    temp->left = temp->right = NULL;
    return temp;
}
 
// inOrder Traverse yapan fonksiyon
void inorder(struct node *root)
{
    if (root != NULL)
    {
        inorder(root->left);
        printf("%d ", root->key);
        inorder(root->right);
    }
}
 
/* verilen değeri (key) BST'ye ekleyen fonksiyon */
struct node* insert(struct node* node, int key)
{
    /* Eğer ağaç boşsa yeni düğüm oluşturur */
    if (node == NULL) return newNode(key);
 
    /* Recursive olarak ekleme yapar */
    if (key < node->key)
        node->left  = insert(node->left, key);
    else
        node->right = insert(node->right, key);
 
    /* değişmemiş düğümü geri döndürür.  */
    return node;
}
 
/* Bir ağacın en küçük düğümünü geri döndürür, while döngüsü traverse işlemi yapar*/
struct node * minValueNode(struct node* node)
{
    struct node* current = node;
 
    /* leaf düğümü bulan while döngüsü */
    while (current->left != NULL)
        current = current->left;
 
    return current;
}
 
/* root değeri verilen ağaçtan key değerini silen fonksiyon */
struct node* deleteNode(struct node* root, int key)
{
    // root null ise null root döndürür
    if (root == NULL) return root;
 
    // eğer verilen değer root'dan küçükse sol alt ağac recursive olarak  işlem yapılır
    if (key < root->key)
        root->left = deleteNode(root->left, key);
 
    // eğer verilen değer root'dan büyükse sağ alt ağaca recursive olarak işlem yapılır
    else if (key > root->key)
        root->right = deleteNode(root->right, key);
 
    // eğer root ile key aynı olursa, esas silme işlemi bu durumda yapılır
    else
    {
        // sadece bir çocuğu olan ya da hiç çocuğu olmayan düğümü silmek için
        // aşağıdaki işlem yapılır
        if (root->left == NULL)
        {
            struct node *temp = root->right;
            free(root);
            return temp;
        }
        else if (root->right == NULL)
        {
            struct node *temp = root->left;
            free(root);
            return temp;
        }
 
        // 2 çocuğu olan düğümler için aşağıdaki satır devreye girer
        struct node* temp = minValueNode(root->right);
        
         root->key = temp->key;
         root->right = deleteNode(root->right, temp->key);
    }
    return root;
}
void algoritmaUzmani();
// fonksiyonları buradan test edebilirsiniz
int main()
{
    /* aşağıdaki ağaç yapısı örnektir.
              50
           /     \
          30      70
         /  \    /  \
       20   40  60   80 */
    struct node *root = NULL;
    root = insert(root, 50);
    root = insert(root, 30);
    root = insert(root, 20);
    root = insert(root, 40);
    root = insert(root, 70);
    root = insert(root, 60);
    root = insert(root, 80);
 
    printf("Inorder traversal sonucu asagidaki gibidir \n");
    inorder(root);
 
    printf("\nDelete 20\n");
    root = deleteNode(root, 20);
    printf(" Silme islemi sonrasi Inorder traversal sonucu \n");
    inorder(root);
 
    printf("\nDelete 30\n");
    root = deleteNode(root, 30);
    printf("Silme islemi sonrasi Inorder traversal sonucu \n");
    inorder(root);
 
    printf("\nDelete 50\n");
    root = deleteNode(root, 50);
    printf("Silme islemi sonrasi Inorder traversal sonucu \n");
    inorder(root);
    
    printf("\n sitemizdeki konuya gitmek icin 7 rakamina basin .... (7)");
    scanf("%d", &secim);
    if(secim == 7)
        algoritmaUzmani();
 
    return 0;
}

//sadece ilgili konuya gitmek icin. diger kodlar ile ilgisi yok
void algoritmaUzmani()
{
     system("C:\\Progra~2\\Google\\Chrome\\Application\\chrome.exe http://www.algoritmauzmani.com/2016/10/ikili-arama-agaci-binary-search-tree.html");
     printf("\n Eger asagida sistem yolu hatasi aliyorsaniz bunu onemsemeyin");
     if(system)
     {
          system("C:\\Progra~1\\Google\\Chrome\\Application\\chrome.exe http://www.algoritmauzmani.com/2016/10/ikili-arama-agaci-binary-search-tree.html");
          if(system)
            system("C:\\Progra~2\\Mozill~1\\firefox.exe http://www.algoritmauzmani.com/2016/10/ikili-arama-agaci-binary-search-tree.html");
            if(system)
                system("C:\\Progra~1\\Mozill~1\\firefox.exe http://www.algoritmauzmani.com/2016/10/ikili-arama-agaci-binary-search-tree.html");
     }
}

Etiketler: , ,