C# ile Ağaç Veri Modeli

Batuhan Düzgün tarafından yayınlanmıştır 25. October 2012 06:21

Merhaba arkadaşlar bu yazıda sizlerle birlikte “Ağaç Veri Modeli”  C# programlama diliyle programlanacaktır. Ağaç veri modeliyle hiyerarşik bir yapı oluşturulmuş olunacaktır. Her çocuk düğümün bir ebeveyn düğümü olacaktır.

Ağaç Veri Modeli

Klasik olarak bir ağaç yapısı şeklinde sanal olarak düğümlerin ilişkilendirilmesiyle oluşturulur.  Ağaç modelin bir kök düğüm yer alır. Bu kök düğüme bağlı çocuk düğümler ve onlara da bağlı çocuk düğümler şeklinde ağaç modeli oluşur. Aşağıda örneği verilmiştir.

Hazırlanacak olan veri modelinde ağaç yapısını oluşturacak olan sınıf “Tree” isminde olacaktır. “Tree” sınıfı oluşturulurken , “Node” isminde ağacın düğümlerini oluşturacak olan sınıflar hazırlanır. “Node” sınıfından oluşturulmuş olan nesneler birbiriyle ilişkilendirilir.

Ayrıca birden fazla “Tree”  oluşturmak için “TreeManager” sınıfı oluşturulur. Bu sınıf ile ağaç modeli oluşturma sorumluluğu bu sınıfa verilmiştir.  “Tree” sınıfı ise “Node” nesneleriyle birlikte veri modelinde yer alacak olan ilişkisel ağı oluşturma sorumluluğunu üstlenir.

Proje Amacı

Hazırlanacak olan projede verilen klasör dizinleri altında yer alan klasörler ile ağaç modeli oluşturulacaktır. Yani C:\\Android dizininde yer alan bütün klasörler ve onların içinde yer alacak olan klasörlerle birlikte ağaç yapısı oluşturulur.

Örnek :

1.       Ana Düğüm  :  “C:\\Android”

1.1   Çocuk Düğüm :  “C:\\Android\\plugins”

1.1.1          Çocuk Düğüm : “C:\\Android\\plugins\\samsung”

1.1.2          Çocuk Düğüm : “C:\\Android\\plugins\\htc”

1.2   Çocuk Düğüm : “C:\\Android\\lib”

1.3   Çocuk Düğüm : “C:\\Android\\source”

Yukarıdaki gibi hiyerarşik yapıda olan klasör dizini ağaç modeline uygun hale getirilecektir.

TreeManager Sınıfı

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace WindowDiskSearch

{

    public static class TreeManager

    {

        private static List<Tree> trees = new List<Tree>();

        public static void createAllTree()

        {

            // Klasör dizinlerinin yollarını tutan dizi.

            string[] paths = { "C:\\Android", "C:\\Java"};

            foreach (string path in paths)

            {

                // Her klasör dizini için bir ağaç modeli oluşturulur.

                // Verilen klasör dizini altında yer alan bütün klasörler ile ağaç modeli oluşturulur.

                Tree driveTree = Tree.createTree(path);

                trees.Add(driveTree);

            }

        }

    }

}

 

Tree Sınıfı

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Security.Permissions;

using System.Security;

using System.Security.AccessControl;

using System.Threading;

 

namespace WindowDiskSearch

{

    // Tree Node'lar ile ağaç yapısını kuracaktır.

    class Tree

    {

        /*

         * Tree sınıfı hem static metodlar hemde dinamik hafızada yer alacak olan metodlar barındırır.

         * "createTree" metodu static olarak tanımlanmıştır. Bu metoda Tree yaratma sorumluluğğu verilmiştir.

         */

 

        // Ağacın kök düğümüdür.

        private Node parentNode = null;

        public Tree() { }

        public static Tree createTree(string path)//(DriveInfo drive)

        {

            // Verilen klasör dizini üzerinde ağaç modeli oluşturulur.

            Tree driverTree = new Tree();

            DirectoryInfo dirInfo = new DirectoryInfo(path); //drive.RootDirectory;

            Node parentNode = new Node();

            // "createChildNodes" metodu sürekli rekürsif bir şekilde çağrılarak, ağaç yapısı kurulur.

            parentNode.addNode(createChildNodes(dirInfo, ref parentNode));

            driverTree.setParentNode(parentNode);

            return driverTree;

        }

        // Rekürsiyon kullanılarak ağacı oluşturan metoddur.

        public static Node createChildNodes(DirectoryInfo dirInf, ref Node parentNode)

        {

            DirectoryInfo[] folders = null;

            try

            {

                // Eğerki alınan dizindeki klasör içinde birden fazla klasör var ise,

                // Bu klasör ebeveyn düğüm olacaktır, içindeki klasörler ise onun alt düğümleri olacaktır.

                // Bu ebeveyn düğüm ise ağacın kök düğümüne alt düğüm olarak eklenecektir.

                folders = dirInf.GetDirectories();

            }

            catch

            {

                return null;

            }

            // Düğümün ismi setlenir.

            parentNode.setNodeName(dirInf.Name);

            parentNode.setParentNode(parentNode);

 

            // Dizinde yer alan klasör içinde birden fazla klasör var ise tek tek alınıp alt düğüm olarak eklenmeye başlanır.

            if (folders.Length > 0)

            {

                foreach (DirectoryInfo childDirInf in folders)

                {

                    // Alınan alt düğüm rekürsif olarak aynı metoda parametre olarak gönderilir.

                    // Eğer gönderilen düğümün alt düğümleri yok ise yaprak düğümdür ve bu düğüm ebeveyn düğüme eklenir.

                    Node node = new Node();

                    Node childNode = createChildNodes(childDirInf, ref node);

                    if (childNode != null)

                    {

                        parentNode.addNode(childNode);

                    }

                }

            }

 

            // Eğerki if içine girilmemişse bu düğüm yaprak düğümdür ve çocuk düğüm barındırmaz anlamına gelir.

            return parentNode;

        }

        public void setParentNode(Node parentNode)

        {

            this.parentNode = parentNode;

        } 

        public Node getParentNode()

        {

            return this.parentNode;

        }

    }

}

Yukarıdaki kod bloğunda açıklamalar detaylıca verilmiştir.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace WindowDiskSearch

{

    // Ağacın temel biri düğüm sınıfıdır.

    class Node

    {

        // Düğümün ebeveyn düğümüdür.

        private Node parentNode = null;

        // Ebeveyn düğüme bağlı alt düğümlerin listesidir.

        // Çocuk düğümlerdir.

        private List<Node> childNodes = null;

        private string nodeName = null;

        public Node()

        {

            childNodes = new List<Node>();

        }

        public Node(string nodename) : this()

        {

            this.nodeName = nodename;

        }

        public void setParentNode(Node node)

        {

            this.parentNode = node;

        }

        public Node getParentNode()

        {

            return this.parentNode;

        }

        public void addNode(Node node)

        {

            this.childNodes.Add(node);

        }

        public List<Node> getChildNodes()

        {

            return this.childNodes;

        }

        public void setNodeName(string nodename)

        {

            this.nodeName = nodename;

        }

        public string toString()

        {

            return this.nodeName;

        }

    }

}

Node” sınıfı ağacın temel yapı taşıdır.  “Node” sınıflarından oluşturulmuş olan nesneler ile ilişkisel ağaç modeli oluşturulur.

Program çalıştırıldığında, “C:\\Android” ve “C:\\Java” dizinlerinin her biri için ağaç modeli aşağıdaki gibi oluşturulur.

 

 
 
 

Umarım yararlı bir yazı olmuştur. Bir sonraki makalemde görüşmek dileğiyle …

Batuhan Düzgün

Bilgisayar Mühendisi

Endüstri Mühendisi 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

C#

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  November 2018  >>
MoTuWeThFrSaSu
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

Yazıları geniş takvimde göster