AVL-Ağaçları (Trees)
Dengeli İkili Ağaç İkili arama ağacının dezavantajı, yüksekliğin N-1 kadar olabilmesidir. Bunun manası: Ekleme ve silme ve diğer bir çoğu işlem gerçekleştirilirken karmaşıklığın en kötü durumda O(N) olmasıdır. İstenen özellik ağacın yüksekliğinin küçük olmasıdır. N tane düğümü olan ikili ağacın yüksekliği en az (log N) ‘ dir. Bu nedenle, amaç ikili arama ağacının yüksekliğini O(log N) olarak tutabilmektir. Bu tür ağaçlara dengeli ikili ağaçlar denilir. Örnekler AVL ağaçlar, kırmızı-siyah ağaçlar (red-black tree)
AVL ağaçlar Bir düğümün yüksekliği Bir yaprağın yüksekliği 1’dir. Null işaretçinn yüksekliği sıfırdır. İç bir düğümün yüksekliği çocuklarının maksimum yüksekliğinin 1 fazlasıdır. Not: Burada yapılan yükseklik tanımı daha önce yapılandan farklıdır.
AVL Ağaçlar AVL ağaç bir ikili ağaçtır ve aşağıdaki şartı sağlar ağaçtaki herbir düğüm için, sol ve sağ altağaçların yükseklikleri en fazla 1 farklılık gösterir. AVL özelliği burada ihlal edilmiştir
AVL Ağaç x, yüksekliği h olan bir AVL ağacın kökü olsun. Nh , yüksekliği h olan bir AVL ağaçtaki düğümlerin minimum sayısını göstersin. Açıkça görülebilir ki Ni ≥ Ni-1 Böylece Genel form aşağıdaki gibi olur. Sınır şartlar: N1=1 ve N2 =2. Buradan h = O(log Nh) manası çıkarılır. Böylece, AVL ağaç üzerinde yapılacak işlemlerin çoğu O(log N) zaman alır.
Dönüşler (Rotations) Ağaç yapısı değiştiği zaman (ekleme veya silme gibi), AVL ağaç özelliğini sağlama için ağacı değiştirmeliyiz. Bu işlem tek dönüş veya çift dönüş yapılarak sağlanır. Örnek: Tek dönüş y x x A y B C C B A Dönüşten sonra Dönüşten önce
Dönüşler Ekleme/ silme işlemi tek bir düğüm ekleme ve silme içerdiği için, bazı altağaçların yüksekliği 1 kadar artabilir / azalabilir. Böylece, bir x düğümünde, AVL ağaç özelliği ihlal edildiği zaman, bunun manası of left(x) ve right(x) kesinlikle 2 birim fark ediyor demektir. AVL ağaç özelliğini korumak için x’ e dönüpler uygulanacaktır.
Ekleme (Insertion) Öncelikle, sıradan bir ikili ağaca ekleniyormuş gibi yeni anahtarı yeni bir yaprak olarak ekle Yeni yapraktan köke kadar olan yolu takip et. Karşılaşılan herbir x düğümü için left(x) ve right(x) ‘in en fazla 1 farklılık içerip içermediğini kontrol et. Evet ise parent(x) ile devam et. Değilse, ya bir tek dönüş yada bir çift dönüş ile Eklem için, x düğümünde bir dönüş gerçekleştirdikten sonra, x’ in geri kalan ata sında herhangi bir dönüp gerçekleştirilmesine gerek yoktur.
Ekleme X, left(x) ve right(x) değerlerinin birden fazla farklı olduğu yerde bir düğüm olsun. x in yüksekliğini h+3 olduğunu varsayalım Bu halde 4 durum oluşur. left(x) in yüksekliği h+2 (yani right(x) in yüksekliği h) left(left(x)) in yüksekliği h+1 sol çocuk ile (üzerinde) tek dönüş right(left(x)) in yüksekliği h+1 sol çocuk ile çift dönüş right(x) yüksekliği h+2 (yani left(x) in yüksekliği h) right(right(x)) in yüksekliği h+1 sağ çocuk ile (üzerinde) tek dönüş left(right(x)) in yüksekliği h+1 sağ çocuk ile (üzerinde) çift dönüş
Tek dönüş A altağacına yeni bir anahtar eklendi. x ‘ de AVL ağaç özelliği ihlal edildi. left(x) yüksekliği h+2 right(x) yüksekliği h.
Tek dönüş C altağacına yeni bir anahtar eklendi. x ‘ de AVL ağaç özelliği ihlal edildi. Tek dönüş O(1) kadar zaman alır. Ekleme O(log N) kadar zaman alır.
x AVL Tree C y 8 B A Ekle 0.8 3 5 Dönüşten sonra 5 5 8 3 3 4 1 4 1 0.8
Çift dönüş B1 veya B2 alt ağaçlarına yeni anahtar eklendi. x de AVL-özelliği ihlal edildi. x-y-z bir zig-zag şekli oluşturur Ayrıca sol-sağ dönüş olarak da isimlendirilir
Çift dönüş B1 veya B2 alt ağaçlarına yeni anahtar eklendi. x de AVL-özelliği ihlal edildi. Ayrıca sağ-sol dönüş olarak da isimlendirilir
x y A z B C AVL Tree 8 ekle 3.5 4 5 Dönüşten sonra 5 5 8 3 3 4 1 4 1
Genişletilmiş örnek ekle 3,2,1,4,5,6,7, 16,15,14 3 3 3 5 Tek dönüş Şekil 3 2 1 3 Şekil 4 3 2 Şekil 2 3 Şekil 1 2 1 3 4 Şekil 5 2 1 3 4 5 Şekil 6 Tek dönüş
5 Tek dönüş Şekil 10 6 2 1 4 5 3 Şekil 8 2 1 4 5 3 Şekil 7 Tek dönüş 4
4 2 6 7 1 3 5 16 Şekil 12 4 2 6 7 1 3 5 16 15 Şekil 13 Çift dönüş 4 2 6 15 1 3 5 16 7 Şekil 14
5 4 2 7 15 1 3 6 16 14 Şekil 16 4 2 6 15 1 3 5 16 7 14 Şekil 15 Çift dönüş
Silme Sıradan bir ikili ağaçta olduğu gibi x düğümünü sil. Daha sonra köke olan yol aşağıdaki gibi incelenir. Karşılaşılan herbir x düğümü için sol(x) (left(x)) ve sağ(x) (right(x)) altağaçlarının yükseklik farkının 1 olup olmadığına bak. Eğer fark 1 ise ebeveyn(x) üzerinden işleme devam et. Aksi takdirde x üzerinde gerekli dönüşleri yap. Eklemede olduğu gibi silmede de 4 durum vardır. Silme için, x’de dönüş yaptıktan sonra, x’in atalarında da (ancestor) dönüşler yapmamız gerekebilir. Bu işlemi köke ulaşana kadar uygularız.
Deletion Silme için tek dönüşler 4 duruma (iki durum yerine ) ayrılabilir. On closer examination: the single rotations for deletion can be divided into 4 cases (instead of 2 cases) Sol çocukla dönüşler için iki durum. Sağ çocukla dönüşler için iki durum.
Silme işlemindeki tek dönüşler Her iki şekilde de , altağaç C’den bir düğüm silimiştir ve yükseklihi h’ a düşürmüştür. y’nin yüksekliği h+2 ‘ dir. A’nın yüksekliği h+1 olduğu zaman, B’nin yüksekliği ya h’dır yada h+1’dir. Her iki durumu da aynı tek dönüş düzeltebilir. Sol çocuk üzerinden dönüş
Silme işlemindeki tek dönüşler Her iki şekilde de altağaaç A’dan bir düşüm silimiştir ve yükseklik h’ a düşmüştür. y’nin yüksekliği h+2’ dir. C’nin yüksekliği h+1 olduğu zaman, B’nin yükseklikliği h veya h+1 olabilir. Her iki durumu da tek dönüş düzeltebilir. rotate with right child
Silmedeki dönüşler Tek dönüş için 4 durum vardır fakat hepsini ayrı ayrı değerlendirmeye gerek olmayabilir. Çift dönüş için eklemede olduğu gibi 2 durum vardır. Dolayısı ile eklemede belirlendiği mantıkla silmede de hangi dönüşlerin gerçekleştirilebileceği belirlenebilir.