10 - Ağaç (Tree) Veri Yapısı
2026
Ağaç, düğümler ve bu düğümler arasındaki bağlantılardan oluşan, doğrusal olmayan hiyerarşik bir veri yapısıdır.
Bazı veriler doğal olarak hiyerarşik yapıdadır.
Bu tür verileri dizilerde de tutmak teknik olarak mümkündür; ancak üst-alt ilişkisini ve dallanmayı doğrudan modellemek hem güçleşir hem de gereksiz karmaşıklık yaratır.
Bu derste, temel kavramları tanımak için özellikle ikili ağaç (binary tree) yapısına odaklanacağız.
Bir ağaçta genellikle şu terimler kullanılır:
İkili ağaçta bir düğümün en fazla iki çocuğu olabilir: sol çocuk ve sağ çocuk.
Aşağıdaki ikili ağaçta:
Kenar (edge): Bir ebeveyn düğüm ile onun çocuğu arasındaki bağlantıdır.
Derinlik (depth): Bir düğümün derinliği, kökten o düğüme kadar olan yol üzerindeki kenar sayısıdır.
Düzey (level): Aynı derinliğe sahip düğümler aynı düzeydedir. Bu derste düzey numarasını derinlikle aynı kabul edeceğiz; yani kök 0. düzeydedir.
Bu nedenle:
Yukarıdaki örnekte ağaçta toplam 7 düğüm ve 6 kenar vardır.
Yandaki ağaç için:

Yükseklik (height): Ağacın yüksekliği, kökten en derin yaprağa kadar olan en uzun yol üzerindeki kenar sayısıdır.
Başka bir ifadeyle, ağacın yüksekliği en derin düğümün derinliğine eşittir.
Yandaki ağaçta en derin yaprağa giden yolda 3 kenar bulunduğu için ağacın yüksekliği 3’tür.

İkili ağaçtaki her düğümde veri tutulur ve sol/sağ alt ağacı gösteren iki işaretçi bulunur.
item: düğümde tutulan verileft: sol çocuğu gösteren işaretçiright: sağ çocuğu gösteren işaretçiBir düğümün sol veya sağ çocuğu yoksa ilgili işaretçi NULL olur.
Bellekte bir düğüm şu şekilde oluşturulur:
malloc çağrısı bellekte bir TreeNode için yer ayırır. left ve right alanları başlangıçta NULL olarak atanır; çocuk düğümler eklendikçe bu işaretçiler güncellenir.
Not: Gerçek programlarda
mallocçağrısının başarısız olup olmadığı da kontrol edilmelidir; bellek yetersizseNULLdöndürür.
Dolu ikili ağaç (full binary tree): Her iç düğümün tam olarak iki çocuğu olduğu, yaprakların ise hiç çocuğu olmadığı ağaçtır.
Başka bir ifadeyle, bir düğümün ya 0 ya da 2 çocuğu vardır.
Tam ikili ağaç (complete binary tree): Son düzey dışında tüm düzeylerin tamamen dolu olduğu ve son düzeydeki düğümlerin soldan sağa boşluksuz yerleştirildiği ağaçtır.
Tam olmak da her iç düğümün mutlaka iki çocuğu olduğu anlamına gelmez.
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int item;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode *createNode(int value) {
TreeNode *node = malloc(sizeof(TreeNode));
if (node == NULL) {
printf("Bellek ayirma hatasi!\n");
exit(1);
}
node->item = value;
node->left = NULL;
node->right = NULL;
return node;
}int main(void) {
TreeNode *root = createNode(10);
root->left = createNode(4);
root->right = createNode(13);
root->left->left = createNode(3);
root->left->right = createNode(7);
root->right->left = createNode(11);
root->right->right = createNode(15);
printf("Kok: %d\n", root->item);
printf("Sol cocuk: %d, Sag cocuk: %d\n", root->left->item, root->right->item);
printf("Yapraklar: %d, %d, %d, %d\n",
root->left->left->item,
root->left->right->item,
root->right->left->item,
root->right->right->item);
return 0;
}

Aşağıdaki ifadelerden hangisi yanlıştır?
NULL kontrolü zorunludur: boş bir düğüme erişim tanımsız davranışa (undefined behavior) yol açar.Basit bir ikili ağaç yapısını C dilinde elle oluşturup aşağıdaki işlemleri deneyin: