Java Tree yapısı.

Başlatan enesbaspinar, 29 Aralık 2018 - 20:52:12

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

enesbaspinar

Merhaba arkadaşlar. Şuan tree yapısı üzerinde çalışıyorum geneli öğrensem daha kolay olacak. Binary tree ve diğer çeşitler hakkında bolca kaynak var ama genel ağaç yapısı hakkında kaynak bulamadım hepsi binary tree anlatıyorlar atlayıp. Çocukları ArrayListe atadığım için arama olayını nasıl olacağını düşünüyorum ama bir türlü işin içinden çıkamadım bilgisi olan biri varsa yardım edebilirse çok sevinirim. Ağaç classım şu şekilde :

public class dugum{
   int veri;
   ArrayList <dugum> cocuklar= new ArrayList<>();
}


Alt düğüm eklemek için düğümlerde nasıl gezinicem? Veya arama yapmak için? (Kullanıcı her düğüme n tane çocuk düğüm ekleyebilir.)
Ayrıca ben düğümleri bir yol üzerinden ekleyeceğim. Mesele Dersler\Matematik\Diferansiyel Matematik yoksa mesela önce onu sonrada Diferansiyeli oluşturmaya çalışıyorum. Bi nevi windows dosya sistemi gibi.

fsutil

Node'ları arraylist içersinde tutma ihtiyacı duyacağını sanmıyorum. Zaten Node'lar birbirine bağlı şekilde bulunuyor.

Şu şekilde bi yapı kurulabilir arama işlemi için;



public <T> Node find(Node<T> root, T value) {
    if(root == null) {
        return;
    } else {
        if(value.equals(node.value)) {
            return root;
        } else if(value.compareTo(root.value)) {
            return find(root.right);
        } else {
            return find(root.left);
        }
    }
}

enesbaspinar

Alıntı yapılan: fsutil - 29 Aralık 2018 - 21:33:11
Node'ları arraylist içersinde tutma ihtiyacı duyacağını sanmıyorum. Zaten Node'lar birbirine bağlı şekilde bulunuyor.

Şu şekilde bi yapı kurulabilir arama işlemi için;



public <T> Node find(Node<T> root, T value) {
    if(root == null) {
        return;
    } else {
        if(value.equals(node.value)) {
            return root;
        } else if(value.compareTo(root.value)) {
            return find(root.right);
        } else {
            return find(root.left);
        }
    }
}


Cevabınız için teşekkürler lakin sol ve sağ düğüm olmayacak bu ağaçta. Yani n çocuklu olacak. Resimdeki gibi.

[eklenti yönetici tarafından silindi]

Amenofis

Ağaçlarda gezinme recursive olarak yapılıyor. Her düğüm kendi alt düğümlerinin kökü olduğundan yola çıkarsak zaten recursive bir problem.

YIllar önce tic-tac-toe oyunu için bir ağaç kullanmıştım. Aklımda kaldığı kadarıyla çocukları dizi şeklinde değil de her düğüme bir çocuk ve bir kardeş atıyorduk. Çocuklar kardeş düğümleriyle birbirine bağlanıyordu.

enesbaspinar

#4
Alıntı yapılan: Amenofis - 29 Aralık 2018 - 22:42:45
Ağaçlarda gezinme recursive olarak yapılıyor. Her düğüm kendi alt düğümlerinin kökü olduğundan yola çıkarsak zaten recursive bir problem.

YIllar önce tic-tac-toe oyunu için bir ağaç kullanmıştım. Aklımda kaldığı kadarıyla çocukları dizi şeklinde değil de her düğüme bir çocuk ve bir kardeş atıyorduk. Çocuklar kardeş düğümleriyle birbirine bağlanıyordu.

Cevabınız için teşekkürler. Dediğiniz gibide yapılıyor internette tanımlama bu şekildede yapanlar var. Ama mesela ben yazdığım gibi Dersler\Matematik\Diferansiyel şeklinde aldığım bir stringi bölerek ("Dersler","Matematik","Diferansiyel") şekline getirip nasıl bunlar ile ağaç yapısı oluşturabilirim? Recursive fonksiyondan kastınız tam olarak nasıl yapılıyor söyleme şansınız var mı? İnternette gerçekten de genel tree yapısının algoritmalarını bulamadım sadece tanımlama bulabildim. Düğümlerde gezinme algoritmasını bulsam çözeceğimi düşünüyorum.

Amenofis

Yukarıda arkadaş binary tree için yazmış, ona benzer. Resurcive, bir metodun kendi kendini çağırması. Mesela bir metod yaz, bir düğüm alsın ve çocuklarını yazdırsın. Metod önce çocukları ekrana yazar, sonra her çocuk düğüm ile tekrar çağrılır. Onlar da kendi çocuklarını yazar ve yapraklara kadar tüm ağaç ekrana basılmış olur.

Bu, türkçe literatürde "önce kardeş ilerleme" diye geçer yanlış hatırlamıyorsam. Eğer metod, çocukları yazmadan önce kendini çağırırsa bu durumda önce en dibe kadar gider, dönüşte işlem yapar. Buna da "önce çocuk ilerleme" deniyordu. 

enesbaspinar

Alıntı yapılan: Amenofis - 30 Aralık 2018 - 00:21:18
Yukarıda arkadaş binary tree için yazmış, ona benzer. Resurcive, bir metodun kendi kendini çağırması. Mesela bir metod yaz, bir düğüm alsın ve çocuklarını yazdırsın. Metod önce çocukları ekrana yazar, sonra her çocuk düğüm ile tekrar çağrılır. Onlar da kendi çocuklarını yazar ve yapraklara kadar tüm ağaç ekrana basılmış olur.

Bu, türkçe literatürde "önce kardeş ilerleme" diye geçer yanlış hatırlamıyorsam. Eğer metod, çocukları yazmadan önce kendini çağırırsa bu durumda önce en dibe kadar gider, dönüşte işlem yapar. Buna da "önce çocuk ilerleme" deniyordu.

Yani ArrayListleri foreach ile dönderip foreach içinede fonksiyonun recursive'ini yazmam gerek. Bunu deneyeyim teşekkürler. Birde bu arama algoritmasını düğüm eklerkende kullanabilirim değil mi algoritma konusunda sıkıntılarım var biraz :S