Bölüm 5. Ağaç Olcay Taner Yıldız 2014 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 1 / 73
O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 2 / 73
14 düğümden oluşan bir ağaç yapısı 6 3 7 4 9 2 5 17 8 18 12 37 27 28 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 3 / 73
Tanımlar Ağaçtaki x düğümünden y düğümüne bir ok varsa x düğümüne y düğümünün ebeveyni y düğümüne ise x in çocuğu denir. Bir düğümün çocuk sayısı o düğümün derecesini belirtir. Ağaçtaki bir x düğümünden başlayıp çocukları üzerinden giderek bir y düğümüne ulaşılabiliyorsa, y düğümüne x düğümünün soyu, x düğümüne de y düğümünün atası denir. Ağaçtaki bir düğümün hiç çocuğu yoksa o düğüme yaprak düğüm denir. Bir ağacın derinliği o ağacın kökünden herhangi bir yaprağa ulaşmak için geçtiğimiz elemanların sayısının en fazlasıdır. O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 4 / 73
O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 5 / 73
Altı elemandan oluşan bir ikili arama ağacı 6 3 7 2 5 8 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 6 / 73
Altı düğümden oluşan bir ağaç. 6 3 9 4 5 12 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 7 / 73
15 elemandan oluşan 4 derinliğindeki dengeli bir ikili ağaç 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 8 / 73
Altı elemandan oluşan 4 derinliğindeki bir ikili ağaç yapısı 2 3 7 6 8 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 9 / 73 5
Tam sayılar içeren düğüm tanımı 1 public class Dugum{ 2 int icerik; 3 Dugum sol; 4 Dugum sag; 5 public Dugum(int icerik){ 6 this.icerik = icerik ; 7 sol = null; 8 sag =null; 9 } 10 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 10 / 73
Tam sayılar içeren ikili arama ağacı tanımı 1 public class Agac{ 2 Dugum kok; 3 public Agac(){ 4 kok =null; 5 } 6 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 11 / 73
O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 12 / 73
Örnek bir ikili arama ağacında 5 i arama. 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 13 / 73
Verilen bir değeri ikili arama ağacında arayan özyinelemeli algoritma 1 Dugum agacara(int eleman){ 2 if ( icerik == eleman) 3 return this; 4 else 5 if ( icerik > eleman) 6 if (sol!= null) 7 return sol.agacara(eleman); 8 else 9 return null; 10 else 11 if (sag!= null) 12 return sag.agacara(eleman); 13 else 14 return null; 15 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 14 / 73
Verilen bir değeri ikili arama ağacında arayan yinelemesiz algoritma 1 Dugum agacara(int eleman){ 2 Dugum d; 3 d = kok; 4 while (d!=null){ 5 if (d. icerik == eleman) 6 return d; 7 else 8 if (d. icerik > eleman) 9 d = d.sol; 10 else 11 d = d.sag; 12 } 13 return null; 14 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 15 / 73
İkili arama ağacındaki en küçük elemanı arama 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 16 / 73
Arama ağacındaki en küçük elemanı bulan yinelemesiz algoritma 1 Dugum asgariara(){ 2 Dugum sonuc =this; 3 while (sonuc.sol!=null) 4 sonuc = sonuc.sol; 5 return sonuc; 6 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 17 / 73
Arama ağacındaki en küçük elemanı bulan özyinelemeli algoritma 1 Dugum asgariara(){ 2 if (sol == null) 3 return this; 4 else 5 return sol.asgariara(); 6 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 18 / 73
İkili arama ağacındaki en büyük elemanı arama 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 19 / 73
Arama ağacındaki en büyük elemanı bulan yinelemesiz algoritma 1 Dugum azamiara(){ 2 Dugum sonuc =this; 3 while (sonuc.sag!=null) 4 sonuc = sonuc.sag; 5 return sonuc; 6 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 20 / 73
Arama ağacındaki en büyük elemanı bulan özyinelemeli algoritma 1 Dugum azamiara(){ 2 if (sag ==null) 3 return this; 4 else 5 return sag.azamiara(); 6 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 21 / 73
Örnek bir ikili arama ağacına 13 elemanının eklenmesi. 12 5 18 2 6 15 19 13 17 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 22 / 73
Arama ağacına yeni bir eleman ekleyen algoritma 1 void agacaekle(dugum yeni){ 2 Dugum y =null; 3 Dugum x = kok; 4 while (x!=null){ 5 y = x; 6 if (yeni. icerik < x. icerik ) 7 x = x.sol; 8 else 9 x = x.sag; 10 } 11 if (y == null) 12 kok = yeni; 13 else 14 if (yeni. icerik < y. icerik ) 15 y.sol = yeni; 16 else 17 y.sag = yeni; 18 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 23 / 73
Örnek bir ikili arama ağacın kök elemanının silinmesi (1) 12 5 18 2 9 15 19 6 13 17 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 24 / 73
Örnek bir ikili arama ağacın kök elemanının silinmesi (2) 9 5 18 2 6 15 19 13 17 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 25 / 73
Arama ağacından bir eleman silen algoritma 1 void agacsil(int icerik){ 2 Dugum y =null, x = kok; 3 while (x.icerik!= icerik ){ 4 if (x. icerik > icerik ) 5 x = x.sol; 6 else 7 x = x.sag; 8 } 9 while (true){ 10 if (x.sol!= null) 11 y = x.sol.azamiara(); 12 if (y ==null && x.sag!=null) 13 y = x.sag.asgariara(); 14 if (y == null) 15 break; 16 x. icerik = y. icerik ; 17 x = y; 18 } 19 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 26 / 73
İkili Arama Arama: O(log N) Ekleme: O(log N) Silme: O(log N) O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 27 / 73
O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 28 / 73
Önce gezinti algoritması 1 void oncegezinti(){ 2 System.out.print( icerik ); 3 if (sol!= null) 4 sol.oncegezinti(); 5 if (sag!= null) 6 sag.oncegezinti(); 7 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 29 / 73
Ara gezinti algoritması 1 void aragezinti(){ 2 if (sol!= null) 3 sol.aragezinti (); 4 System.out.print( icerik ); 5 if (sag!= null) 6 sag.aragezinti(); 7 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 30 / 73
Sonra gezinti algoritması 1 void sonragezinti(){ 2 if (sol!= null) 3 sol.sonragezinti(); 4 if (sag!= null) 5 sag.sonragezinti(); 6 System.out.print( icerik ); 7 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 31 / 73
İkili arama ağacında değişik gezinti algoritmalarının düğümleri ziyaret ediş sıraları O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 32 / 73 Önce Gezinti Ara Gezinti Sonra Gezinti 6 1 3 2 2 3 5 4 7 5 8 6 6 4 3 2 2 1 5 3 7 5 8 6 6 6 3 3 2 1 5 2 7 5 8 4
İçeriği bir ağaç düğümü (alt ağaç) olan eleman yapısı 1 public class Eleman{ 2 Dugum dugum; 3 Eleman ileri ; 4 public Eleman(Dugum dugum){ 5 this.dugum = dugum; 6 ileri = null; 7 } 8 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 33 / 73
Bir ikili arama ağacındaki düğüm sayısını bulan algoritma (Çıkın) (1) 1 int dugumsayisi(){ 2 Dugum d; 3 Eleman e; 4 Cikin c; 5 int sayi = 0; 6 c = new Cikin(); 7 d = kok; 8 if (d!= null){ 9 e = new Eleman(d); 10 c. cikinekle(e); 11 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 34 / 73
Bir ikili arama ağacındaki düğüm sayısını bulan algoritma (Çıkın) (2) 12 while (!c.cikinbos()){ 13 e = c. cikinsil (); 14 d = e.dugum; 15 sayi++; 16 if (d.sol!= null){ 17 e = new Eleman(d.sol); 18 c. cikinekle(e); 19 } 20 if (d.sag!= null){ 21 e = new Eleman(d.sag); 22 c. cikinekle(e); 23 } 24 } 25 return sayi; 26 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 35 / 73
Bir ikili arama ağacındaki düğüm sayısını bulan algoritma (Kuyruk) (1) 1 int dugumsayisi(){ 2 Dugum d; 3 Eleman e; 4 Kuyruk k; 5 int sayi = 0; 6 k = new Kuyruk(); 7 d = kok; 8 if (d!= null){ 9 e = new Eleman(d); 10 k.kuyrugaekle(e); 11 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 36 / 73
Bir ikili arama ağacındaki düğüm sayısını bulan algoritma (Kuyruk) (2) 12 while (!k.kuyrukbos()){ 13 e = k.kuyruksil (); 14 d = e.dugum; 15 sayi++; 16 if (d.sol!= null){ 17 e = new Eleman(d.sol); 18 k.kuyrugaekle(e); 19 } 20 if (d.sag!= null){ 21 e = new Eleman(d.sag); 22 k.kuyrugaekle(e); 23 } 24 } 25 return sayi; 26 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 37 / 73
O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 38 / 73
1 den 7 ye kadar olan sayıların farklı sırada ikili arama ağacına eklenmesiyle oluşan iki değişik ağaç 4 4 2 6 3 5 1 3 5 7 2 6 1 7 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 39 / 73
İkili arama ağaçları (a) AVL 5 (b) AVL değil 6 2 7 2 7 1 4 6 1 4 3 3 5 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 40 / 73
Tam sayılar içeren AVL düğümü tanımı 1 public class AvlDugum{ 2 int icerik; 3 int boy; 4 AvlDugum sol; 5 AvlDugum sag; 6 public AvlDugum(int icerik){ 7 this.icerik = icerik ; 8 sol = null; 9 sag =null; 10 boy = 1; 11 } 12 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 41 / 73
AVL ağacı tanımı 1 public class AvlAgac{ 2 AvlDugum kok; 3 public AvlAgac(){ 4 kok =null; 5 } 6 } 7 int boy(avldugum d){ 8 if (d == null) 9 return 0; 10 else 11 return d.boy; 12 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 42 / 73
Durum 1 i çözmek için uygulanan tek rotasyon (a) (b) k 2 k 1 k 1 k 2 C B A B C A O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 43 / 73
Durum 1 i çözmek için uygulanan tek rotasyon algoritması 1 AvlDugum soltekrotasyon(avldugum k2){ 2 AvlDugum k1 = k2.sol; 3 k2.sol = k1.sag; 4 k1.sag = k2; 5 k2.boy = azami(boy(k2.sol), boy(k2.sag)) + 1; 6 k1.boy = azami(boy(k1.sol), k1.sag.boy) + 1; 7 return k1; 8 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 44 / 73
Durum 4 ü çözmek için uygulanan tek rotasyon (a) (b) k 1 k 2 A k 2 k 1 B A B C C O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 45 / 73
Durum 4 ü çözmek için uygulanan tek rotasyon algoritması 1 AvlDugum sagtekrotasyon(avldugum k1){ 2 AvlDugum k2 = k1.sag; 3 k1.sag = k2.sol; 4 k2.sol = k1; 5 k2.boy = azami(k2.sol.boy, boy(k2.sag)) + 1; 6 k1.boy = azami(boy(k1.sol), boy(k1.sag)) + 1; 7 return k2; 8 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 46 / 73
Durum 2 yi çözmek için uygulanan çift rotasyon (a) (b) k 3 k 2 k 1 D k 1 k 3 k 2 A A B C D B C O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 47 / 73
Durum 2 yi çözmek için uygulanan çift rotasyon algoritması 1 AvlDugum solciftrotasyon(avldugum k3){ 2 k3.sol = sagtekrotasyon(k3.sol); 3 return soltekrotasyon(k3); 4 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 48 / 73
Durum 3 ü çözmek için uygulanan çift rotasyon (a) (b) k 1 k 2 A k 3 k 1 k 3 k 2 D A B C D B C O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 49 / 73
Durum 3 ü çözmek için uygulanan çift rotasyon algoritması 1 AvlDugum sagciftrotasyon(avldugum k1){ 2 k1.sag = soltekrotasyon(k1.sag); 3 return sagtekrotasyon(k1); 4 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 50 / 73
AVL ağacına yeni bir eleman ekleyen algoritma (Java) (1) 1 void agacaekle(avldugum yenieleman){ 2 Avldugum y =null, x = kok, t; 3 Eleman e; 4 int yon1 = 0, yon2 = 0; 5 Cikin c = new Cikin(100); 6 while (x!=null){ 7 y = x; 8 e = new Eleman(y); 9 c. cikinekle(e); 10 yon1 = yon2; 11 if (yenieleman.icerik < x. icerik ){ 12 x = x.sol; 13 yon2 = SOL; 14 }else{ 15 x = x.sag; 16 yon2 = SAG; 17 } 18 } 19 cocukyerlestir(y, yenieleman); O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 51 / 73
AVL ağacına yeni bir eleman ekleyen algoritma (Java) (2) 20 while (!c.cikinbos()){ 21 e = c. cikinsil (); 22 x = e.dugum; 23 x.boy = azami(boy(x.sol), boy(x.sag)) + 1; 24 if (Math.abs(boy(x.sol) - boy(x.sag)) == 2){ 25 if (yon1 == SOL && yon2 == SOL) 26 t = soltekrotasyon(x); 27 if (yon1 == SOL && yon2 == SAG) 28 t = solciftrotasyon(x); 29 if (yon1 == SAG && yon2 == SOL) 30 t = sagciftrotasyon(x); 31 if (yon1 == SAG && yon2 == SAG) 32 t = sagtekrotasyon(x); 33 e = c. cikinsil (); 34 y = e.dugum; 35 cocukyerlestir(y, t ); 36 break; 37 } 38 } 39 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 52 / 73
O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 53 / 73
15 veri içeren d= 2 dereceli örnek bir B+ ağacı 11 18 25 32 2 4 6 7 14 15 19 20 25 28 29 34 36 38 42 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 54 / 73
13 veri içeren d= 1 dereceli örnek bir B+ ağacı 18 32 6 11 20 28 36 2 4 6 7 14 19 25 27 29 30 33 37 39 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 55 / 73
B+ düğümü tanımı 1 public class BDugum{ 2 int[] K; 3 int m; 4 int d; 5 boolean yaprak; 6 BDugum[] nesil; 7 public BDugum(int d){ 8 m = 0; 9 this.d = d; 10 yaprak =true; 11 K =newint[2 * d + 1]; 12 nesil = new BDugum[2 * d + 1]; 13 } 14 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 56 / 73
B+ ağacı tanımı 1 public class BAgac{ 2 BDugum kok; 3 public BAgac(){ 4 kok =null; 5 } 6 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 57 / 73
Önceki şekildeki B+ ağacında 30 un aranması 18 32 6 11 20 28 36 2 4 6 7 14 19 25 27 29 30 33 37 39 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 58 / 73
Verilen bir değeri B+ ağacında arayan algoritma 1 BDugum agacara(int eleman){ 2 int cocuk; 3 BDugum b; 4 b = kok; 5 while (!b.yaprak){ 6 cocuk = b.pozisyon(eleman); 7 b = b.nesil [cocuk]; 8 } 9 return b; 10 } 11 int pozisyon(int eleman){ 12 int i; 13 if (eleman >= K[m - 1]) 14 return m; 15 else 16 for (i = 0; i < m; i++) 17 if (eleman < K[i]) 18 return i; 19 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 59 / 73
Önceki şekildeki ağaca 22 nin eklenmesi 11 18 25 32 2 4 6 7 14 15 19 20 22 25 28 29 34 36 38 42 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 60 / 73
Önceki şekildeki ağaca 22 nin eklenmesi 25 18 32 6 11 20 28 36 2 4 6 7 14 19 22 25 27 29 30 33 37 39 O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 61 / 73
Verilen bir değeri B+ düğümüne ekleyen algoritma (1) 1 BDugum dugumeekle(bagac a,int eleman){ 2 BDugum s, yeni; 3 int cocuk, i; 4 cocuk = pozisyon(eleman); 5 if (! nesil [cocuk].yaprak) 6 s = nesil [cocuk].dugumeekle(a, eleman); 7 else 8 s = nesil [cocuk].yapragaekle(eleman); 9 if (s == null) 10 return null; 11 for (i = m; i > cocuk; i --) 12 K[i ] = K[i - 1]; 13 K[cocuk] = s.k[2 * d]; 14 if (m < 2 * d){ 15 for (i = m + 1; i > cocuk; i --) 16 nesil [ i ] = nesil [ i - 1]; 17 nesil [cocuk] = s; 18 m++; 19 return null; O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 62 / 73
Verilen bir değeri B+ düğümüne ekleyen algoritma (2) 20 } else { 21 yeni = new BDugum(d); 22 for (i = 0; i < d; i++) 23 yeni.k[i ] = K[d + i + 1]; 24 yeni.k[2 * d] = K[d]; 25 for (i = 0; i < d; i++) 26 yeni. nesil [ i ] = nesil [d + i + 1]; 27 yeni.m = d; 28 m = d; 29 if (this == kok){ 30 a.kok = new BDugum(d); 31 a.kok.m = 1; 32 a.kok.nesil [0] = this; 33 a.kok.nesil [1] = yeni; 34 a.kok.k[0] = this.k[d]; 35 return null; 36 } else 37 return yeni; 38 } 39 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 63 / 73
Verilen bir değeri B+ yaprağına ekleyen algoritma 1 BDugum yapragaekle(int eleman){ 2 int i, cocuk; 3 BDugum yeni; 4 cocuk = pozisyon(eleman); 5 for (i = m; i > cocuk; i --) 6 K[i ] = K[i - 1]; 7 K[cocuk] = eleman; 8 if (m < 2 * d){ 9 m++; 10 return null; 11 } else { 12 yeni = new BDugum(d); 13 for (i = 0; i < d + 1; i++) 14 yeni.k[i ] = K[d + i ]; 15 yeni.k[2 * d] = K[d]; 16 yeni.m = d + 1; 17 m = d; 18 return yeni; 19 } 20 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 64 / 73
O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 65 / 73
Veritabanı Öğrenci Sistemi veritabanı Üniversiteye kayıtlı olan lisans, yüksek lisans, doktora vs. tüm öğrencilerin bilgilerini içeren ogrenci tablosunu, Üniversitede ders veren tüm öğretim görevlilerinin bilgilerini içeren gorevli tablosunu, Üniversitede o güne kadar açılmış olan tüm derslerin bilgilerini içeren ders tablosunu, Üniversiteye kayıtlı olan tüm öğrencilerin o güne kadar almış olduğu tüm derslerin notlarını içeren not tablosunu,... içerecektir. O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 66 / 73
Sorgu Numarası 18 olanın ad ve soyadını ogrenci tablosundan SELECT Ad, Soyad FROM Ogrenci WHERE No = 18 sorgusuyla, numarası 23 ten büyük tüm öğrencilerin sayısını ise yine ogrenci tablosundan SELECT Count(*) FROM Ogrenci WHERE No > 23 sorgusuyla öğreniriz. O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 67 / 73
Öğrenci bilgilerini (no, ad, soyad) içeren düğüm yapısı. 1 public class Dugum{ 2 String ad; 3 String soyad; 4 int icerik; 5 Dugum sol; 6 Dugum sag; 7 public Dugum(int no, String ad, String soyad){ 8 this.icerik = no; 9 this.ad = ad; 10 this.soyad = soyad; 11 sol = null; 12 sag =null; 13 } 14 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 68 / 73
Örnek öğrenci bilgileri dosyası 4 21 Oğuz Kerem 18 Aysel Serhat 42 Aysu İpek 26 Ergin Doğan O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 69 / 73
Öğrenci dosyasındaki bilgilerle ikili arama ağacını doldurmak 1 Agac dosyaoku(){ 2 Scanner dosya; 3 Dugum d; 4 String ad; 5 String soyad; 6 int no, yas, i, sayi; 7 Agac agac; 8 dosya =new Scanner(new File("ogrenci.txt")); 9 sayi = dosya.nextint (); 10 agac =new Agac(); 11 for (i = 0; i < sayi; i++){ 12 no = dosya.nextint (); 13 ad = dosya.next(); 14 soyad = dosya.next(); 15 d = new Dugum(no, ad, soyad); 16 agac.agacaekle(d); 17 } 18 return agac; 19 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 70 / 73
Örnek öğrenci dosyasındaki bilgilerle doldurulan ikili arama ağacı 21 Oğuz Kerem 18 Aysel Serhat 42 Aysu İpek 26 Ergin Doğan O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 71 / 73
Numarası 18 olan öğrencinin ad ve soyadını bulan yinelemesiz fonksiyon 1 void sorgu(agac a){ 2 Dugum d; 3 d = a.kok; 4 while (d!=null){ 5 if (d. icerik < 18) 6 d = d.sag; 7 else 8 if (d. icerik > 18) 9 d = d.sol; 10 else{ 11 System.out.print(d.ad); 12 System.out.print(d.soyad); 13 break; 14 } 15 } 16 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 72 / 73
Numarası 23 ten büyük kaç öğrenci olduğunu bulan fonksiyonlar 1 int sorgu2(dugum d){ 2 int sayi = 0; 3 if (d. icerik > 23){ 4 sayi = 1; 5 if (d.sol!= null) 6 sayi += sorgu2(d.sol); 7 } 8 if (d.sag!= null) 9 sayi += sorgu2(d.sag); 10 return sayi; 11 } 12 int sorgu(agac a){ 13 if (a.kok!= null) 14 return sorgu2(a.kok); 15 else 16 return 0; 17 } O. T. Yıldız, C && Java ile Veri Yapılarına, Boğaziçi Üniversitesi Yayınevi, 2013 73 / 73