// **************** 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: bst eleman silme, ikili arama ağacı eleman silme işlemi, ikili arama ağacı silme c kodu