C#' ta Ağaç Yapıları: Veri Silme İşlemleri

Merhabalar bu gün de yine ödevim olan bir program paylaşacağım. Öncelikle ağaç yapıları hakkında biraz bilgi vereceğim. Ardından programla ilgili bir kaç açıklamada bulunacağım.

Ağaç yapıları(Tree Structures) bağlı listelerle oluşturabileceğiniz bir yapıdır. Kök veriye eklenecek olan verilerden küçük olan her zaman sol kenara, büyük olan ise kök verinin sağ kenarına yerleşir. En tepedeki veriyi tutan düğüme root(kök), alt düğümü olan düğümlere parent(ebeveyn), parent altındaki düğümlere child(çocuk), çocuğu olmayan düğümlere ise leaf(yaprak) denir. Bu düğümler arasında bağlantıyı sağlayan bağlantı bilgilerine de kenar adı verilir.  Bilgisayardaki klasör sistemleri, ağaç yapılarına bir örnektir. Bu kadar ön bilgiden sonra kodlama kısmına geçebiliriz.

Kodlama kısmına geçtiğimizde ise Node classı içinde düğüm yapısını oluşturdum. Uygulama classı içinde metodları yazdım. Bu metodları kısaca açıklamak istiyorum. “ekle” metodu, yukarda bahsettiğim kurala göre (büyük sağ kenara, küçük sol kenara) verileri yapıya ekliyor. “preorder” metodu ise verileri “preorder prensibi” ne göre listeliyor. “yerineyaz” metodunda ise önce silinecek veri tespit ediliyor, ardından “bul” metoduyla silinecek verinin yerine yazılacak veri bulunuyor ve static durumdaki max değişkenine atanıyor. Böylece max değişkenini “yerineyaz” metodu içinde kullanıp silme işlemini tamamlamış oluyoruz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace finaldenemeler
{
class Node
{
public int? veri;
public Node leftnode, rightnode;
public Node(int? veri, Node leftnode, Node rightnode)
{
this.veri = veri;
this.rightnode = rightnode;
this.leftnode = leftnode;
}
}
class methods
{
public static int? move;
public void add(int veri, Node root)
{
Node yeninode = new Node(veri, null, null);
if (root.veri == null)
{
root.veri = veri;
}
else
{
Node current=root;
Node parent;
while(true)
{
parent = current;
if (veri > parent.veri)
{
current = current.rightnode;
if (current == null)
{
parent.rightnode = yeninode;
break;
}
}
else
{
current = current.leftnode;
if (current == null)
{
parent.leftnode = yeninode;
break;
}
}
}
}
}
public void preorder(Node node)
{
Console.WriteLine(node.veri);
if (node.leftnode != null)
preorder(node.leftnode);
if (node.rightnode != null)
preorder(node.rightnode);
}
public void findRight(Node node)        // sağ taraftan silinen veri yerine koyulacak veriyi bulan metod
{
if (node.leftnode.leftnode != null)
{
findRight(node.leftnode);
}
else
{
move = node.leftnode.veri;
if (node.leftnode.rightnode == null)
node.leftnode = null;
else
node.leftnode = node.leftnode.rightnode;
}
}
public void findLeft(Node node)     // sol taraftan silinen veri yerine koyulacak veriyi bulan metod
{
if (node.rightnode.rightnode != null)
{
findLeft(node.rightnode);
}
else
{
move = node.rightnode.veri;
if (node.rightnode.leftnode == null)
node.rightnode = null;
else
node.rightnode = node.rightnode.leftnode;
}
}
public void rightDelete(int data, Node root)        //sağ taraftan veri silen metod
{
Node current = root;
Console.WriteLine(“root= “ + root.veri);
if (current.rightnode != null)
{
if (current.rightnode.veri == data)
{
if (current.rightnode.rightnode.leftnode == null)
{
current.rightnode = current.rightnode.rightnode;
}
else
{
findRight(current.rightnode.rightnode);
Console.WriteLine(“move=” + move);
current.rightnode.veri = move;
}
}
else
{
rightDelete(data, current.rightnode);
}
}
}
public void leftDelete(int data, Node root)     //sol taraftan veri silen metod
{
Node current = root;
if (current.leftnode != null)
{
if (current.leftnode.veri == data)
{
Console.WriteLine(“Buldummm!!! “);
if (current.leftnode.leftnode.rightnode == null)
{
current.leftnode = current.leftnode.leftnode;
}
else
{
findLeft(current.leftnode.leftnode);
Console.WriteLine(“move= “ + move);
current.leftnode.veri = move;
}
}
else
{
leftDelete(data, current.leftnode);
}
}
}
}
class Program
{
static void Main(string[] args)
{
methods call = new methods();
Node root = new Node(null, null, null);
int delete;
#region eklenen sayilar
call.add(25, root);
call.add(15, root);
call.add(10, root);
call.add(7, root);
call.add(13, root);
call.add(17, root);
call.add(30, root);
call.add(26, root);
call.add(43, root);
call.add(40, root);
call.add(45, root);
call.add(39, root);
#endregion
call.preorder(root);
Console.WriteLine(“Silmek istediğiniz sayıyı girinizn”);
delete = Convert.ToInt16(Console.ReadLine());
if (delete > root.veri)
{
call.rightDelete(delete, root);
}
if (delete < root.veri)
{
call.leftDelete(delete, root);
}
call.preorder(root);
}
}
}

Kod üzerinde bazı gerekli açıklamaları da yaptım, programın tamamı bitmediği için sadece sağ tarafta arama yapıyor program. En kısa zamanda programın tamamlanmış halini paylaşacağım. Anlaşılmayan noktalar için iletişime geçebilirsiniz. İyi çalışmalar…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir