Lisp Dili Ağaç İşlemleri

Merhaba arkadaşlar bu yazımda sizlere Lisp türevi dil olan DrRacket ile ağaç oluşturmayı ve bu ağaçlar üzerinde işlem yapacağız. Hemen anlatıma geçelim.

Öncelikle ağaçların bir kök bir sol çocuğu ve bir sağ çocuğu olur. Bir binary tree örneğini hemen ekliyorum.

veri yapıları binary tree örnek ağaç

Yukarıdaki ağaca baktığımızda 2 alt ağaca sahip bir ağaç görünüyor. Bunun DrRacket’deki karşılığını adım adım yazalım.

En temel hali ile DrRacket’da kök, sol ve sağ aşağıdaki gibi tanımlanmaktadır.

(list 2 ‘() ‘())

Şimdi sol ve sağ çocukları girelim.

(list 2
      (list 3 '() '() )
      (list 8 '() '() ))

Karışmaması için alt satırlara alarak yazdım. Bu sefer de eklenen her elemanın alt düğümü olması gerektiği için o kısımları boş da olsa ‘() ifadesini bırakıyoruz. Ve eklenen elemanları list olarak belirtiyoruz.

Şimdi ilk kökümüzün çocukları tamamlandı. Şimdi gelelim eklediğimiz elemanların alt çocuklarını eklemeye…

(list 2

      (list 3 (list 9 '() '() ) (list 4 '() '()) )

      (list 8 (list 7 '() '() ) (list 1 '() '()) )
)

Ağacımızın son hali yukarıdaki gibidir.

Ağacın Kökünü Bulma

Bu işlem için yukarıda tanımladığımız ağacı bir değişkene atıyoruz.

(define Agac (list 2

(list 3 (list 9 ‘() ‘() ) (list 4 ‘() ‘()) )

(list 8 (list 7 ‘() ‘() ) (list 1 ‘() ‘()) )

))

Şimdi kodumuza geçelim:

(define Agac(list 2

      (list 3 (list 9 '() '() ) (list 4 '() '()) )

      (list 8 (list 7 '() '() ) (list 1 '() '()) )
))

(define (kokbul agac)(first agac))

(kokbul Agac)

kokbul adında bir fonksiyon oluşturdum ve ağacın ilk elemanını almak için first anahtar kelimesini kullanıyoruz.

Ağaç kök bulma görseli

Dr racket kök bulma

Ağacın Elemanlarını Toplama

(define Agac(list 2

      (list 3 (list 9 '() '() ) (list 4 '() '()) )

      (list 8 (list 7 '() '() ) (list 1 '() '()) )
))

(define (kokbul agac)(first agac))

(kokbul Agac)

(define (topla agac) (if (empty? agac)0 
                         (+ (first agac)
                            (topla (car (cdr agac)))
                            (topla (car (cdr (cdr agac)))))))
(topla Agac)

Kodumuzu incelersek..

Önce topla isimli bir fonksiyon oluşturdum.

if değimi ile gelen ağacın boş olma durumunu kontrol ettim. Eğer boş değilse, ilk elemanını aldık. Daha sonra yine topla fonksiyonunu çağırarak ağacın ilk elemanını çıkarıp kalan elemanları gönderdik (cdr). Bu şekilde if şartı sağlanana kadar devam ettik.

Ağaç elemanları toplama görseli

dr racket ağaçtaki elemanları toplama

 

Ağaçtaki En Büyük Elemanı Bulma

Sadece sayıları değiştirdim az önce yazdığımız kodları silerek devam ediyorum..

(define Agac(list 12

      (list 13 (list 19 '() '() ) (list 14 '() '()) )

      (list 81 (list 71 '() '() ) (list 12 '() '()) )
))

(define (kok agac) (car agac))
(define (sol agac) (car (cdr agac)))
(define (sag agac) (car (cdr (cdr agac))))

(define (enb2 a b) (if (> a b) a ; a büyük ise a 
                       b));değilse b yi döndür

(define (enb3 a b c) (enb2 (enb2 a b) (enb2 b c))) ; üç sayının en büyüğü

(define (enbuyuk agac) (if (empty? agac)0 ;boş ise 0 yaz
                           (enb3 (kok agac)
                                 (enbuyuk (sol agac))
                                 (enbuyuk (sag agac))))) 
(enbuyuk Agac)

Öncelikle ağacımızın bir kökü bir solu ve bir sağı olduğu için bunları bulan fonksiyonu tanımladık.

Daha sonra iki eleman geldiğinde en büyüğünü bulmak için gereken kodu yazdık ve üç eleman geldiğinde iki elemanmış gibi bu oluşturduğumuz enb2 fonksiyonuna gönderdik.

Daha sonra ise bu üç elemanın birincisi kök ikincisi sol üçüncüsü de sağ değer olacak şekilde düşünerek enb3 fonksiyonu içine gönderdik.

Ağaçtaki En Büyük Elemanı Bulma Görseli

lisp ağaçdaki en büyük elemanı bulma

Umarım faydalı olmuştur başarılar.

Bunlara Göz Atmak İsteyebilirsiniz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir