1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Trees & Binary Search Tree(Ikili Arama Ağacı)

2022-05-26

Ağaç , verilerin birbirine sanki bir ağaç yapısı oluşturuyormuş gibi sanal olarak bağlanmasıyla elde edilen hiyerarşik yapıya sahip bir veri yapısıdır.Arkadaşlar ağaçta bilmemiz gereken birkaç tanım var örneğin , ğacın kök işaretçisi yani en üstteki düğüm root olarak bilinir,kendisine hiçbiir bağlantısı olmayan düğümlere yaprak , ebeveyn(parent) düğüm kendisine herhangi alt düğümü olacak düğümdür en azından bir alt düğüm varsa o parent düğüm olur , sibling(çocuk) düğüm de parent'i olan düğümdür.

Ağaç yapısının özellikler ;

Depth (Derinlik) : Bir düğümün kök olan uzaklığıdır.Kök düğüm 0 derinliğe sahiptir.

Yükseklik (Height) : Bir düğümün kendisine en uzak mesafedeki yaprak düğüme olan düze ayısıdır.Ağacın yüksekliği düğümün yüksekliğidir.İngilizce tanımı da iyi geldi ; The height of node x can be defined as the longest path from the node x to the leaf node.

Level : Iki düğüm arasındaki yolun üzerinde bulunan düğümlerin sayısıdır.Root düğümün levei 1 , doğrudan kök bağlı düğümlerin düzeyi 2'dir.

 

Bu derste İkili Arama ağaç yapısına bağkacağız. İkili ağaç yapısı adı da üzerinden anlaşılacağı gibi ikili , yani bir düğüm en az 0,1, yada 2 çocuk düğüme sahip olabilir.Bir düğüm 3 çocuk düğüme sahip olamaz ya 0 , 1 yada 2 tane düğümü olacak.C dilinde tek tek kodlamanın neler yaptığını da yazdım umarım anlaşılır olmuştur.

 

#include<stdio.h>
#include<stdlib.h>

//
struct node {
    int data;
    struct node * left;
    struct node * right;
};

 

// burda kökümüzü oluşturuyoruz
struct node * createRoot(int data){
    // bellekten yer ayrıyoruz
    struct node * root = (struct node * ) malloc (sizeof(struct node));
    // verilen data'yı ekliyoruz
    root->data=data;
    // kök eleman olduğu için sağ ve sol düğümler yok , o yüzden NULL
    root->right=root->left=NULL;
    // kökümüzü geri dönderiyoruz.
    return root;
}


// ekleme fonksiyonumuz , root'umuzu alıyor ve verilen veriyi alıyoruz
struct node * insertion(struct node * root,int data){
    // eğer ki kök yok ise createRoot fonksiyonumuzu çağırıyoruz
    if(root==NULL){
        return createRoot(data);
    }
    // var ise ve girilen data kök düğümümüzün datasından küçük ise
    if(data < root->data){
        // sola ekleme yapıyoruz, recursive yapıda
        root->left = insertion(root->left,data);
    }
    // yok eğer büyük ise
    else{
        // sağa ekleme yapıyoruz
        root->right = insertion(root->right,data);
    }
    return root;
}

// preorder traversal işlemimiz
void preorder(struct node * root){ // kök başta
    if(root==NULL){
        return;
    }
    // kök boşta , sol taraf ve sağ taraf şeklinde olur
    else{
        printf("%d\t",root->data);
        preorder(root->left);
        preorder(root->right);
    }
}

// inorderda
void inorder(struct node * root){ // kök ortada
    if(root==NULL){
        return;
    }else{
    // sol , kök ortada , sağ
        inorder(root->left);
        printf("%d\t",root->data);
        inorder(root->right);
    }
}


// postorderda
void postorder(struct node * root){ // kök sonda
    if(root==NULL){
        return;
    }
    // sol , sağ , kök şeklindedir
    else{
        postorder(root->left);
        postorder(root->right);
        printf("%d\t",root->data);
    }
}

int main(){
    struct node * nod = NULL;
    int i=0,sayi;
    while(i<7){
        printf("Data : \n");
        scanf("%d",&sayi);
        nod = insertion(nod,sayi);
        i++;
    }
    
    printf("preOrder : ");
    preorder(nod);
    printf("\ninOrder : ");
    inorder(nod);
    printf("\npostOrder : ");
    postorder(nod);
    
    
    return 0;    
}