Öncelikle bazı terimlerden bahsetmek istiyorum.

Kök- Yukarıdaki resimde görüldüğü gibi ağaç yapımızda tüm elemanlar aslında tek bir yere bağlı. Buna kök diyoruz.
Çocuk ve ebeveyn- Kök hariç her düğümün bir ebeveyni vardır.
Yaprak-Çocuğu olmaya düğümlere denir. 3-7-10 gibi
Kardeş-Ebeveyni aynı olan düğümlerdir.
İkili Ağaçların özellikleri
- Hiçbir düğümün ikiden fazla çocuğu olamaz.
- Ortalama bir ağacın derinliği(kökten düğüme olan yolun uzunluğu) N’den küçüktür. En kötü durumda N-1 olur.
Ağaç Gezme
Önce kök gezme(pre-order traversar)
- Kökteki veriyi yaz
- Sol altağaçtaki veriyi iteratif olarak yaz
- Sağ altağaçtaki veriyi iteratif olarak yaz

Çıktı: ++a*bc*+*defg
Sonra kök gezme(post-order traversar)
- Sol altağaçtaki veriyi iteratif olarak yaz
- Sağ altağaçtaki veriyi iteratif olarak yaz
- Kökteki veriyi yaz
Çıktı: abc*+de*f+g*+
İç kök gezme(in-order traversar)
- Sol altağaçtaki veriyi iteratif olarak yaz
- Kökteki veriyi yaz
- Sağ altağaçtaki veriyi iteratif olarak yaz
Çıktı: a+b*c+d*e+f*g
Ayrıca iç kök gezme işlemi ile sayıları da sıralamış oluruz.
namespace binaryTree
{
class TreeNode
{
private TreeNode solDugum;
private TreeNode sagDugum;
private int data;
#region
public TreeNode SolDugum
{
get
{
return solDugum;
}
set
{
solDugum = value;
}
}
public TreeNode SagDugum
{
get
{
return sagDugum;
}
set
{
sagDugum = value;
}
}
public int Data
{
get
{
return data;
}
set
{
data = value;
}
}
#endregion
//node constructor
public TreeNode(int dugumDatasi)
{
data = dugumDatasi;
SagDugum = null; //ilk oluşturduğumuzda sag ve sol dugumleri yok
SolDugum = null;
}
public void Ekle(int eklenecekData)
{
//eğer eklenecek data kendi datadan küçük ise sola ekle
if (eklenecekData < data)
{
if (solDugum == null)
solDugum = new TreeNode(eklenecekData);
else
solDugum.Ekle(eklenecekData);
}
//eğer eklenecek data kendi datadan büyük ise sağa ekle
else if (eklenecekData > data)
{
if (sagDugum == null)
sagDugum = new TreeNode(eklenecekData);
else
sagDugum.Ekle(eklenecekData);
}
}
}
}
using System;
namespace binaryTree
{
public class Agac
{
private TreeNode kok;
public Agac()
{
kok = null; //ağaç ilk oluşturulduğunda kökü boş olacak
}
public void DugumEkle(int eklenecekDeger)
{
lock (this)
{
if (kok == null)
kok = new TreeNode(eklenecekDeger);
else
kok.Ekle(eklenecekDeger);
}
}
public void OnceKokGezme()
{
lock (this)
{
OnceKokGezmeHelper(kok);
}
}
private void OnceKokGezmeHelper(TreeNode kok)
{
if (kok == null)
return;
Console.Write(kok.Data + " ");
OnceKokGezmeHelper(kok.SolDugum);
OnceKokGezmeHelper(kok.SagDugum);
}
public void IcKokGezme()
{
lock (this)
{
IcKokGezmeHelper(kok);
}
}
private void IcKokGezmeHelper(TreeNode kok)
{
if (kok == null)
return ;
IcKokGezmeHelper(kok.SolDugum);
Console.Write(kok.Data + " ");
IcKokGezmeHelper(kok.SagDugum);
}
public void SonraKokGezme()
{
lock (this)
{
SonraKokGezmeHelper(kok);
}
}
private void SonraKokGezmeHelper(TreeNode kok)
{
if (kok == null)
return;
SonraKokGezmeHelper(kok.SolDugum);
SonraKokGezmeHelper(kok.SagDugum);
Console.Write(kok.Data + " ");
}
}
}using System;
namespace binaryTree
{
class Program
{
static void Main()
{
Agac agac = new Agac();
int eklenecekDeger;
Random random = new Random();
for (int i = 0; i <= 20; i++)
{
eklenecekDeger = random.Next(1000);
Console.Write(eklenecekDeger + " ");
agac.DugumEkle(eklenecekDeger);
}
Console.WriteLine("\nOnce kok Gezme");
agac.OnceKokGezme();
Console.WriteLine("\nSonra kok Gezme");
agac.SonraKokGezme();
Console.WriteLine("\nİç kok Gezme");
agac.IcKokGezme();
}
}
}
Çıktı:

Bir yanıt yazın