27.12.2013
1
Veri Yapıları
Dr. Sinan TUNCEL
Ağaçlar
Ağaçlar genel bilgi
• Ağaçlar, fizikçi Gustava Kirşof tarafından 1847’de kablo
ağlarındaki elektrik akışını formülize etmek için
kullanılmıştır.
• Kirşof yasaları olarak adlandırılan denklemlerin tamamı
bağımsız olmadığından Kirşof ağaçları kullanarak bu
denklemlerin hangilerinin bağımsız olduğunu belirlemiştir.
• Ağaç terimi, bu çalışmalardan on yıl sonra İngiliz
matematikçi Arthur Cayley tarafından verilmiştir. Cayley
matematik içerisindeki bir problemi incelemek için ağaçlar
üzerine odaklanarak çalışmalar gerçekleştirmiştir. Cayley
kimyadaki izomerleri ağaçları kullanarak incelemiş ve teoriyi
uygulamaya taşımına becerisini göstermiştir.
27.12.2013
2
Ağaçlar genel bilgi
• Ağaçlar, verilerin birbirine sanki bir ağaç yapısı
oluşturuyormuş gibi sanal olarak bağlanmasıyla elde
edilen bir veri modelidir. Ağaç veri modeli daha fazla belek
alanına gereksinim duyar.
• Bağlı listeler, yığınlar ve kuyruklar doğrusal (linear) veri
yapılarıdır. Ağaçlar ise doğrusal olmayan belirli niteliklere
sahip iki boyutlu veri yapılarıdır.
• İçerisinde çevrim (cycle) bulundurmayan bağlantılı grafların
özel bir türüne ağaç adı verilir.
• Ağaçlar bir çok nedenden dolayı graf teorisi içerisinde
önemli bir yere sahiptir. Ayrıca, ağaçlar graf teorisinin birçok
uygulamasında ön plana çıkmaktadır.
Dr.Sinan TUNCEL 3
Nerelerde Kullanılır
Ağaç veri yapısı, günlük yaşamda da karşılaştığımız bir
yapıdır.
• Bir insanın/bitkinin soy ağacı
• hiyerarşik bir yönetimdeki ilişkiler
• şirketlerdeki organizasyon şeması
ağaç veri yapısı kullanılarak kolayca grafiksel olarak
tanımlanabilir.
27.12.2013
3
Nerelerde Kullanılır
Ağaç veri yapısı, bilgisayar bilimlerinde önemli yer tutar. Yazılım
dünyasında birçok yerde programcının karşısına çıkar.
• Arama
• Sıralama
• Söz dizim
• Veri sıkıştırma
• Çözümleme (syntax analysis)
• Kod optimizasyonu (code optimization)
• Derleyici gerçekleştirimindeki ara süreçler
• Hiyerarşik veritabanı
• İşletim sistemlerinin dosya sistemi.
• Oyunların olası hamleleri.
Nerelerde Kullanılır
27.12.2013
4
Nerelerde Kullanılır
7
/ymt
kitaplar kodlar dersler
ymt219 ymt112 ...
1.pdf 2.pdf 1.pdf
2010-2011 eskia.java b.java
ymt219 ymt217 ymt215 ...
1.ppt 1.doc 1.Pdf
Dosya Sistemi
Faydaları
Esneklik : Tek bir amaç için en iyi çözüm ağaç yapısı olmasa da,
çoklu çözümler için ağaç yapısının esnekliği bu yapının avantajı
olarak sayılabilir.
Etkili Arama: Arama sırasında ağacın bazı dalları budanarak arama
yapılması performans artışı sağlar ve bu da verimliliği arttırır.
Ağaç yapısı genellikle bilginin istenilen bölümüne konumlanmak
için genellikle filtreleme aracı olarak kullanılır.
Doğal Temsil: Bilgiyi temsil etmenin doğal bir yoludur.
Ağaç yapısı bir uygulamayı bazen daha kolay uygulanabilir bir hale
dönüştürür.
27.12.2013
5
Ağaç Üzerinde Bazı Tanımlar
Dügüm (node) : Agacın her bir elemanına dügüm adı verilir. Örnekler : A, B, C.
Kök (root) :Agacın en üstteki dügümüne kök (root) adı verilir Düzey 0'daki tek dügüm.
Çocuk (child) : : Bir düğüme doğrudan bağlı (sol ve sagbagı aracılıgı ile baglandıgıdügümler) olan düğümlere o düğümün çocukları denir. B ve C, A'nın çocuklarıdır.
9
A
B C
D E F
G
Derinlik1
2
3
4
Kök
Yaprak
Düğüm
Ara
Düğüm
Yaprak
Düğüm
7 düğümlü ağaç
Ağaç Üzerinde Bazı Tanımlar
Kardeş Düğüm (sibling, brother) : Aynı düğüme bağlı (Aynı parent'a sahip) düğümlere denir. Örnekler : B ile C kardestir. D ile E kardestir. H ile I kardestir.
Aile (Parent) : Düğümlerin doğrudan bağlı olduğu düğüme denir (Bir dügüm, sag ve sol bagları ile baglandıgı dügümlerin parent'ıdır) A dügümü, B ve C dügümlerinin parent'ıdır.
Ata: Aile düğümünün üstündeki düğüme ata denir.
Orman: Ağaçlar kümesi
Yol: Bir düğümden başka bir düğüme gidebilmek için üzerinden geçilmesi gereken düğümlerin listesi.
Derece: Bir düğümden alt hiyerarşiye yapılan bağlantıların sayısıdır.
Düzey / Derinlik (depth) : Kök ile düğüm arasındaki yolun üzerinde bulunan düğümlerin sayısıdır. Bir düğümün kök dügümden olan uzaklıgıdır. Örnek : D düğümünün düzeyi veya derinliği 2'dir.
Ağacın derinligi (depth of tree) : En derindeki yaprağın derinliği veya yüksekligi (height).
Yükseklik: Bir düğümün kendi silsilesindeki en uzak mesafedeki yaprak düğüme olan düzey sayısı
27.12.2013
6
Ağaç Üzerinde Bazı Tanımlar
Altağaç: Ağacın herhangi bir dalı
Yaprak (leaf) : Sol ve sag bagı bos olan düğümlere yaprak adı verilir. Örnekler : D,G,H,I.
Ancestor (üst dügüm) : Bir düğümün parent'ı birinci ancestor'ıdır. Parent'ın parent'ı
(recursion) ikinci ancestor'ıdır. Kök, kendi hariç tüm dügümlerin ancestor'ıdır.
Descendant (alt dügüm) : Bir düğümün iki çocuğu birinci alt düğümüdür. Onların
çocukları da ikinci alt düğümüdür.
N tane düğümden oluşan bir ağacın kenar sayısı N-1 tanedir.
Ağaçtaki iki düğüm arasında en fazla 1 yol olabilir.
Dr.Sinan TUNCEL 11
Ağaç Üzerinde Bazı Tanımlar
12
A
B C
D E F
G
Kök
Tanım kök B D
Çocuk/Derece 2 0 0
Kardeş 1 2 3
Düzey 1 2 3
Aile yok kök C
Ata yok yok Kök
Yol A A, B A,C,D
Derinlik 1 2 3
Yükseklik 4 3 2
27.12.2013
7
Ağaç Üzerinde Bazı Tanımlar
Dr.Sinan TUNCEL 13
Ağaçlar
• Ağaç yapıları ikili veya çoklu bağlı listeler ile gerçekleştirilebilir.
• Ağaçlardaki düğümlerden iki veya daha fazla bağ çıkabilir. İkili ağaçlar (binary trees), düğümlerinde en fazla iki bağ içeren (0,1 veya 2) ağaçlardır.
• Ağaç veri modelinde,
bir kök işaretçisi,
sonlu sayıda düğümleri ve onları birbirine bağlayan dalları vardır.
Veri ağacın düğümlerinde tutulur.
Dallarda ise geçiş koşulları vardır.
Her ağacın bir kök işaretçisi vardır.
Ağaca henüz bir düğüm eklenmemiş ise ağaç boştur ve kök işaretçisi NULL değerini gösterir. Ağaç bu kök etrafında dallanır ve genişler.
Dr.Sinan TUNCEL 14
27.12.2013
8
Ağaç veri modelinin uygulanması
• Sekil de görülen ağacın düğümlerindeki bilgiler sayılardan oluşmuştur.
• Her düğümdeki sol ve sağ bağlar yardımı ile diğer düğümlere ulaşılır. Sol
(leftptr) ve sag (rightptr) baglar bos ("NULL" = "/" = "\") da olabilir.
• Düğüm yapıları değişik türlerde bilgiler içeren veya birden fazla bilgi içeren
ağaçlar da olabilir. veri yapılarındaki ağaçlar kökü yukarıda yaprakları aşağıda
olacak şekilde çizilirler.
Dr.Sinan TUNCEL 15
Kök Node
Yaprak
Node
10
1
2
546
8
11
9
3
13
7
12
Yaprak
Yaprak
Yaprak
YaprakYaprak
Kök
(Binary Tree)
Level
1
2
3
4
5
Ağaç (Tree)
Arama ve sıralama işlemleri için kullanılan İkili Arama Ağacı
(BST: Binary Search Tree) gibi özel ağaç türleri de vardır.
Ağaç yapıları ikili veya çoklu bağlı listeler ile gerçekleştirilebilir.
veri bağ2bağ1
veri veri
27.12.2013
9
17
Ağaçlar
Ağaç tanımı özyinelemelidir:
Bir ağaç iki şekilde olabilir:
a. Boş düğüm kümesi, veya
b. Kök ismi verilen bir düğüm ve 0 veya daha fazla alt-ağacı olan
yapı.
Ağaç veri yapısını gerçekleştirmek için 2 yol vardır.
Bağlantılı liste kullanmak
Dizi kullanmak
18
Ağaç Gerçekleştirimi
Her bir bağlantı için birer bağlantı bilgisi tutulur.
A
B C D
E F
• Problem: Bir sonraki elemanın çocuk sayısını bilmiyoruz.
27.12.2013
10
19
Ağaç Gerçekleştirimi
Daha iyisi: 1. Çocuk/Kardeş GösterimiHer düğümde iki bağlantı bilgisi tutularak hem çocuk hem de yandaki
kardeş tutulabilir.
İstenildiği kadar çocuk/kardeş olabilir.
A
B C D
E F
JAVA Declaration
class AgacDugumu {
int eleman;
AgacDugumu ilkCocuk;
AgacDugumu kardes;
}
İkili Ağaç
İkili Agaç (Binary Tree) :
Kök olarak adlandırılan özel bir düğüm vardır.
– Her düğüm en fazla iki düğüme bağlıdır.
– Kök hariç her düğüm bir daldan gelmektedir.
– Tüm düğümlerden yukarı doğru çıkıldıkça sonuçta köke ulaşılır
İkili Arama Agacı (Binary Search Tree) : Bos olan veya her dügümü
asagıdaki sartlara uyan anahtara sahip bir ikili agaçtır :
• Kökün solundaki alt ağaçlardaki (eger varsa) tüm anahtarlar kökteki
anahtardan küçüktür.
• Kökün sağındaki alt ağaçlardaki (eğer varsa) tüm anahtarlar kökteki
anahtardan büyüktür.
• Sol ve sag alt agaçlar da ikili arama agaçlarıdır.
Dr.Sinan TUNCEL 20
27.12.2013
11
İkili Ağaç
Full binary tree :
i) Her yapragı aynı derinlikte olan
ii) ii) Yaprak olmayan dügümlerin tümünün iki çocugu olan agaç Full
(Strictly) Binary Tree'dir.
iii) Bir full binary tree'de n tane yaprak varsa bu agaçta toplam 2n-1
dügüm vardır.
Complete binary tree : Full binary tree'de yeni bir derinlige soldan saga
dogru dügümler eklendiginde olusan agaçlara Complete Binary Tree
denilir. Böyle bir agaçta bazı yapraklar digerlerinden daha derindir. Bu
nedenle full binary tree olmayabilirler. En derin düzeyde dügümler
olabildigince soldadır.
General Tree (Agaç) : Her düğümün en fazla iki çocugu olabilme sınırı
olmayan ağaçlardır.
Dr.Sinan TUNCEL 21
22
İkili Ağaç
İkili ağac bir düğümün en fazla 2 tane çocuğa sahip olabildiği
ağaçtır
Her düğüm en fazla 2 çocuğa sahip olabilir.
Bilgisayar bilimlerinde en yaygın ağaçtır.
A
C D
Z I
K
Kök
P
MSağ alt ağaç
A
B
A
B
İki farklı ikili ağaç
27.12.2013
12
23
İkili Ağaç (devam)
N tane düğüm veriliyor, İkili ağacın minimum derinliği nedir.
Derinlik 1: N = 1 = 20 düğüm
Derinlik 2: N = 2 ve 3 düğüm = 21 ve 21+1 -1 düğüm
Herhangi bir d derinliğinde, N = ?
24
İkili Ağaç (devam)
• Derinlik 0: N = 1 = 20 düğüm
• Derinlik 1: N = 2 ve 3 düğüm = 21 ve 21+1 -1 düğüm
• D derinliğinde , N = 2d ve 2d+1-1 düğüm (tam bir ikili ağaç)
• En küçük derinlik:log N ≤ d ≤ log(N+1)-1 or Θ(log N)
27.12.2013
13
25
İkili Ağaç (devam)
N düğümlü ikili ağacın minimum derinliği: Θ(log N)
İkili ağacın maksimum derinliği ne kadardır?
Dengesiz ağaç: Ağaç bir bağlantılı liste olursa!
Maksimum derinlik = N
Amaç: Arama gibi operasyonlarda bağlantılı listeden daha iyi
performans sağlamak için derinliğin log N de tutulması
gerekmektedir.
– Bağlantılı liste
– Derinlik = N
26
İkili Ağaç Gerçekleştirimi
sol veri sag
d
public class İkiliAgacDugumu {
public İkiliAgacDugumu sol;
public int veri;
public İkiliAgacDugumu sag;
}
4
6 12
45 7
kök
27.12.2013
14
27
İkili Ağaç Gerçekleştirimi
/* İkili ağaç düğümü oluşturur.
*/
İkiliAgacDugumu DugumOlustur(int veri){
İkiliAgacDugumu dugum = new İkiliAgacDugumu();
dugum.veri = veri;
dugum.sol = null;
dugum.sag = null;
return dugum;
}
veri
dugum
null null
• Bu yordam ikili ağaç düğümü oluşturur ve bunu geri döndürür.
28
İkili Ağaç Gerçekleştirimi
İkiliAgacDugumu dugum = null;
public static void main main(){
kok = DugumOlustur(4);
kok.sol = DugumOlustur(6);
kok.sag = DugumOlustur(12);
kok.sol.sol = DugumOlustur(45);
kok.sag.sol = DugumOlustur(7);
kok.sag.sag = DugumOlustur(1);
} /* main */
4
6 12
45 7
kök
1
• Kök verilmiş olsun tüm ağaç üzerinde dolaşıp elemanları ekrana nasıl yazdırırız.?
− Ağaç dolaşma algoritmaları
27.12.2013
15
29
Kullanılan Verimli Arama Ağaçları
Fikir: Verileri arama ağacı yapısına göre düzenlersek arama işlemi daha verimli olacaktır.
1. İkili Arama Ağacı (Binary search tree (BST))
2. AVL Ağacı
3. Splay Ağacı
4. Red-Black Ağacı
5. B Ağacı ve B+ Ağacı
30
İkili Arama Ağaçı
5
3 7
8
Kök
2 4
<5 >5
SolAA
SağAA
A İkili Arama Ağacı her bir düğümdeki değerlere göre düzenlenir:
Sol alt ağaçtaki tüm değerler kök düğümünden küçüktür.
Sağ alt ağaçtaki tüm değerler kök düğümünden büyüktür.
2
Kök
3
7
85
4
>2
SağAA
27.12.2013
16
31
İkili Arama Ağacı - Tanımlama
sol deger sag
xpublic class BSTDugum {
public BSTDugum sol;
public int deger;
public BSTDugum sag;
}
BST Dugum
3
2 4
9
/* İKİLİ ARAMA AĞACI */
public class BST {
Private BSTDugum kok;
public BST(){kok=null;}
public void Ekle(int deger);
public void Sil(int deger);
public BSTNode Bul(int key);
public BSTNode Min();
public BSTNode Max();
};
7
32
BST Operasyonları - Bul
• Değeri içeren düğümü bul ve bu düğümü geri döndür.
K
SolA SagA
<K >K
1. Arama işlemine kökten başla
2. if (aranaDeger == kok.deger) return kok;
3. if (aranaDeger < kok.deger) Ara SolAA
4. else Ara SagAA
kök
15
kök
<15 >15
Aranan Sayı=13
27.12.2013
17
33
BST Operasyonları - Bul
public BSTDugum Bul2(BSTDugum kok,
int deger){
if (kok == null) return null;
if (deger == kok.deger)
return kok;
else if (deger < kok.deger)
return Bul2(kok.sol, deger);
else /* deger > kok.deger */
return Bul2(kok.sag, deger);
}
• Mavi renkli düğümler arama sırasında ziyaret edilen düğümlerdir.
• Algoritmanın çalışma karmasıklığı O(d) dir. (d = ağaçınderinliği)
Kök
15
6 18
303 7
2 4 13
9
Aranan
sayı=13
public BSTDugum Bul(int deger){
return Bul2(kok, deger);
}
34
BST Operasyonları - Bul
Aynı algoritma while döngüsü yardımıyla yinelemeli şekilde yazılabilir
• Yinelemeli versiyon özyinelemeli versiyona göre daha verimli çalışır.
public BSTDugum Bul(int deger){
BSTDugum p = kok;
while (p){
if (deger == p.deger) return p;
else if (deger < p.deger) p = p.sol;
else /* deger > p.deger */ p = p.sag;
} /* while-bitti */
return null;
} //bul-Bitti
27.12.2013
18
35
BST Operasyonları - Min
Ağaçtaki en küçük elemanı içeren düğümü bulur ve geri döndürür.
En küçük elemanı içeren düğüm en soldaki düğümde bulunur.
Kökten başlayarak devamlı sola gidilerek bulunur.
public BSTDugum Min(){
if (kok == null)
return null;
BSTDugum p = kok;
while (p.sol != null){
p = p.sol;
}
return p;
}
Kök
15
6 18
303 7
2 4 13
9
36
BST Operasyonları - Max
Ağaçtaki en büyük elemanı içeren düğümü bulur ve geri döndürür.
En büyük elemanı içeren düğüm en sağdaki düğümde bulunur.
Kökten başlayarak devamlı sağa gidilerek bulunur.
Kök
15
6 18
303 7
2 4 13
9
public BSTDugum Max(){
if (kok == null)
return null;
BSTDugum p = kok;
while (p.sag != null){
p = p.sag;
}
return p;
}
27.12.2013
19
37
BST Operasyonları – Ekle(int deger)
• Eklenecek değeri içeren “z”isimli yeni bir düğüm oluştur.• Ö.g.: Ekle 14
• Kökten başlayarak ağaç üzerinde eklenecek sayıyı arıyormuş gibi aşağıya doğru ilerle.
• Yeni düğüm aramanın bittiği düğümün çocuğu olmalıdır.
Eklemeden önce
NULL 14
z
Eklenecek “z” düğümü.
z.deger = 14
NULL
Kok
15
6 18
303 7
2 4 13
9
14
z
14
Eklemeden sonra
38
public void Ekle(int deger){
BSTDugum pp = null; /* pp p’nin ailesi */
BSTDugum p = kok; /* Kökten başla ve aşağıya doğru ilerle*/
while (p){
pp = p;
if (deger == p.deger) return; /* Zaten var */
else if (deger < p.deger) p = p.sol;
else /* deger > p.deger */ p = p.sag;
}
/* Yeni değeri kaydedeceğimiz düğüm */
BSTDugum z = new BSTDugum();
z.deger = deger; z.sol = z.sag = null;
if (kok == null) kok = z; /* Boş ağaca ekleme */
else if (deger < pp.deger) pp.sag = z;
else pp.sol = z;
} // ekleme işlemi bitti.
BST Operasyonları – Ekle(int deger)
27.12.2013
20
39
BST Operasyonları – Sil(int deger)
Silme işlemi biraz karmaşıktır.
3 durum var:
1. Silinecek düğümün hiç çocuğu yoksa (yaprak düğüm)– Sil 9
2. Silinecek düğümün 1 çocuğu varsa– Sil 7
3. Silinecek düğümün 2 çocuğu varsa1. Sil 6
Kök
15
6 18
303 7
2 4 13
9 14
40
Silme: Durum 1 – Yaprak Düğümü Silme
Sil 9: Düğümü kaldırın ve
bağlantı kısmını güncelleyin
Kök
15
6 18
303 7
2 4 13
9
Kök
15
6 18
303 7
2 4 13
9 silindikten sonra
27.12.2013
21
41
Silme: Durum 2 – 1 Çocuklu Düğüm
Kök
15
6 18
303 13
2 4 9
7 silindikten sonra
Sil 7: Silinecek düğümün
ailesi ve çocuğu
arasında bağ kurulur
Kök
15
6 18
303 7
2 4 13
9
42
Silme: Durum 3 – 2 Çocuklu Düğüm
Not: Sağ alt ağaçtaki en
küçük eleman yerine sol alt
ağaçtaki en büyük eleman
bulunarak aynı işlemler
yapılabilir.
Sil 6:
1) Sağ alt ağaçtaki en küçük eleman bulunur.(7)
2) Bu elemanın sol çocuğu olmayacaktır.
3) 6 ve 7 içeren düğümlerin içeriklerini değiştirin
4) 6 nolu eleman 1 çocuğu varmış gibi silinir.
6 silindikten sonra
Kök
17
7 18
303 14
2 41610
8 13
Kök
17
6 18
303 14
2 41610
7 13
8
27.12.2013
22
İkili Ağaç Üzerinde Dolaşma
İkili ağaç üzerinde dolaşma birçok şekilde yapılabilir. Ancak
belirli bir yönteme uyulması algoritmik ifadeyi kolaylaştırır.
İkili ağaç üzerinde dolaşmak için 3 temel yol vardır. Bunlar:
Önce-kök (Preorder): Kök, Sol, Sağ
Önce ağacın kökü, sonra sol alt ağaç ve ardından sağ alt ağaç
Ortada-kök (Inorder): Sol, Kök, Sağ
Önce sol alt ağaç, kök ve sağ alt ağaç
Sonra-kök (Postorder): Sol, Sağ, Kök
Önce sol alt ağaç, sağ alt ağaç ve kök.
43
44
Örnek
A
C D
Z I
K
Kök
P
M
Önce-kök
A C P D Z M I K
Ortada-kök
P C A M Z D I K
Sonra-kök
P C M Z K I D A
27.12.2013
23
45
AlgoritmaOnceKok(IkiliAgacDugumu kok){
if (kok == null) return;
System.out.print(kok.veri+" ");
OnceKok(kok.sol);
OnceKok(kok.sag);
}
OrtadaKok(IkiliAgacDugumu kok){
if (kok == null) return;
OrtadaKok(kok.sol);
System.out.print(kok.veri+" ");
OrtadaKok(kok.sag);
}
SonraKok(IkiliAgacDugumu kok){
if (kok == null) return;
SonraKok(kok.sol);
SonraKok(kok.sag);
System.out.print(kok.veri+" ");
}
46
Aynı Sayılarla Başa Çıkma
5
3 7
8
Kök
2 4
Ağaç içerisindeki aynı sayılarla aşağıda verilen iki şeklide başa çıkılabilir:
Düğümde saklanan bir sayaç değişkeni ile
Veya Düğümde kullanılan bağlantılı liste ile
2
1 4
3 2 6
5
3 7
Kök
27.12.2013
24
47
İkili Arama ağacı Uygulamaları
İkili arama ağacı harita, sözlük gibi birçok uygulamada kullanılır.
İkili arama ağacı (anahtar, değer) çifti şeklinde kullanılacak sistemler için uygundur.
Ö.g.: Şehir Bilgi Sistemi
Posta kodu veriliyor , şehir ismi döndürülüyor. (posta kodu/ Şehir ismi)
Ö.g.: telefon rehberi
İsim veriliyor telefon numarası veya adres döndürülüyor. (isim, Adres/Telefon)
Ö.g.: Sözlük
Kelime veriliyor anlamı döndürülüyor. (kelime, anlam)
İyi çalışmalar…
48Dr.Sinan TUNCEL