C/C++ İkili Ağaç (Binary Tree) Yüksekliği Hesaplama 🌲
🎯 Bu Rehberde Ne Öğreneceksiniz?
Bu rehberde, C/C++ dillerinde İkili Ağaç (Binary Tree) yapısının yüksekliğini nasıl hesaplayacağınızı öğreneceksiniz.
Ağaç yüksekliğinin ne anlama geldiğini, bu değeri bulmak için kullanılan özyinelemeli mantığı (recursion) ve bu mantığın gerçek kod üzerindeki uygulamasını adım adım göreceksiniz.
🧠 Teknik Özet
- Ana Konu: İkili Ağaç yüksekliğini hesaplamak
- Yaklaşım: Özyinelemeli (recursive) algoritma
- Zaman Karmaşıklığı: O(N)
- Amaç: Her düğümün alt ağaç yüksekliklerini karşılaştırarak maksimum yüksekliği bulmak
- Uygulama Alanı: Ağaç tabanlı veri yapıları, algoritma optimizasyonu
🌳 İkili Ağaçta Yükseklik Nedir?
Bir ikili ağacın yüksekliği, kök düğümden (root) en uzak yaprak düğüme (leaf) kadar olan en uzun yolun kenar sayısıdır.
Örneğin:
10
/ \
20 30
/ \
40 50
Burada en uzun yol (10 → 20 → 40) **3 kenar** içerir.
Yani bu ağacın yüksekliği **3**’tür.
💡 Formül:
Yükseklik(D) = 1 + max(Yükseklik(Sol), Yükseklik(Sağ))
🔹 1. Ağaç Düğüm Yapısı Oluşturma
Her ağaç düğümünü temsil edecek yapı (Node) aşağıdaki gibidir:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int value;
struct Node *left, *right;
} Node;
🧩 Açıklama: value düğümün değerini, left ve right ise çocuk düğümleri tutar.
🔹 2. Yüksekliği Hesaplayan Fonksiyon
Bu fonksiyon, sol ve sağ alt ağaçların yüksekliğini özyinelemeli olarak hesaplar ve en yükseğine +1 ekler.
int tree_height(Node* root) {
if (root == NULL)
return 0; // Temel durum (base case)
int sol_yukseklik = tree_height(root->left);
int sag_yukseklik = tree_height(root->right);
return (sol_yukseklik > sag_yukseklik ? sol_yukseklik : sag_yukseklik) + 1;
}
💬 Açıklama: Her çağrıda alt ağaçlar gezilir. Boş düğüm için 0, diğerlerinde maksimum alt yükseklik +1 döner.
🔹 3. Ana Program (main) – Örnek Ağaç ve Çıktı
int main() {
Node* root = (Node*) malloc(sizeof(Node));
root->value = 10;
root->left = (Node*) malloc(sizeof(Node));
root->left->value = 20;
root->right = (Node*) malloc(sizeof(Node));
root->right->value = 30;
root->left->left = (Node*) malloc(sizeof(Node));
root->left->left->value = 40;
root->left->right = (Node*) malloc(sizeof(Node));
root->left->right->value = 50;
printf("İkili Ağacın Yüksekliği: %d\n", tree_height(root));
return 0;
}
📤 Beklenen Çıktı:
İkili Ağacın Yüksekliği: 3
⚙️ Algoritma Özellikleri
| Özellik | Açıklama |
|---|---|
| Yaklaşım | Özyinelemeli (recursive) |
| Zaman Karmaşıklığı | O(N) — Her düğüm bir kez ziyaret edilir |
| Bellek Kullanımı | O(h) — h = ağacın yüksekliği kadar çağrı yığını |
| Alternatif Yöntem | BFS (Breadth First Search) ile iteratif yaklaşım |
| Kapsam | AVL, Red-Black Tree gibi dengeli ağaçlarda sık kullanılır |
❓ Sıkça Sorulan Sorular (SSS)
- Yükseklik ile derinlik aynı şey mi?
Yükseklik, kökten yaprağa olan en uzun yoldur. Derinlik ise belirli bir düğümün kökten uzaklığıdır.
- Boş bir ağacın yüksekliği nedir?
Temel duruma göre, kök NULL ise yüksekliği 0’dır.
- Zaman karmaşıklığı neden O(N)?
Çünkü algoritma her düğümü yalnızca bir kez ziyaret eder.
- C ile C++ arasında fark var mı?
C’de max() fonksiyonu yoktur, bu nedenle if/else veya ternary (?:) yapısı kullanılır.
C++’ta <algorithm> kütüphanesiyle std::max() kullanılabilir.
- BFS ile nasıl hesaplanır?
Kuyruk (queue) yapısı kullanılır, her seviye tamamlandığında yükseklik +1 yapılır.
🏁 Sonuç
Bu rehberde, C/C++ ile İkili Ağaç yüksekliğini özyinelemeli olarak hesaplamayı öğrendiniz. Bu yöntem, veri yapısı ve algoritma temellerinin en önemli parçalarındandır.
🌐 Ağaç yapılarıyla çalışırken performans ölçümlerini test etmek için Rabisu Bulut platformunda hemen deneyebilirsiniz.