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;
}