Binary Tree'ler özellikle değişken veri kümelerini saklamak ve arama yapmak için uygun veri yapılarıdır. Ortalama durumda binary tree arama performansı O(log n) olur. Ancak yeni veriler eklendikçe ve tree dengelenmedikçe performans düşer. En kötü durum senaryosunda binary tree bir liste gibi davranır ve arama performansı O(n) olur. Bu yazıda bu durumlardan bahsetmeye ve balanced binary tree veri yapılarından biri olan Red-Black Tree veri yapısını Scala ile gerçeklemeye çalışacağım.
Aşağıda bir binary tree örneği görülüyor. İşe önce binary tree veri yapısını Scala ile gerçekleyerek başlayalım.
Gerçekleyeceğimiz binary tree sıralanabilen her türden veriyi saklayabiliyor olacak. Bu sebeple (type parametreleri kodu biraz karıştırsa da) generic olarak gerçekleyeceğiz. Açıklamalar kod içerisinde yorum satırları olarak yer alıyor.
Yukarıdaki resimdeki ağacı aşağıdaki kod ile oluşturabilecek durumdayız artık. toString metodunun çıktısı yine kod içinde görülüyor.
Aynı ağaca sırasıyla n ve m harflerini eklersek ağacın yeni durumu aşağıdaki gibi olur.
Resimden de anlaşıldığı üzere bu durumda ağacın dengesi hissedilir şekilde bozulmadı. Bir de aşağıdaki durumu değerlendirelim. Ağaca sırasıyla 1, 2, 5 ve 7 değerlerini ekleyelim.
Resimde de göreceğiniz üzere ağacımız bu haliyle bir listeden farksız. Başka bir deyişle eğer veri kümesine artan değerler ekleniyorsa ağaçtan ancak bir liste kadar performans alabiliyoruz. Bu sebeple aşağıda bir Red-Black Tree gerçeklemesi paylaşıyorum. Kodun daha anlaşılır olması için type parametrelerini kaldırım. Bundan dolayı RedBlackTree yapısı yalnızca Int türünden veriler için çalışabiliyor.
Red-Black Tree algoritması için nette oldukça fazla kaynak var. Bu sebeple algoritmayı araştırmayı okuyuculara bırakıyorum. Kodun sonundaki örnekte ağaca sırasıyla 1, 2, 3, 4, 5 ve 6 değerleri ekleniyor. Ağacın yapısını aşağıdaki resimde paylaşıyorum. Yukarıdaki örneğe kıyasla ağacın nasıl da dengeli dağıldığında dikkat ediniz.