Veri Yapıları - Ders Notu - Süper

Transkript

Veri Yapıları - Ders Notu - Süper
4. İKİLİ ARAMA AĞACI
Düğüm geçişi
void preorder(node* r)
{
if (r!=NULL)
{ cout<<r->data<<" ";
inorder(r->l);
inorder(r->r);
}
}
Önce kök değer yazdırılır,
Ardından LDR formunda
Diğer değerler yazdırılır.
4. İKİLİ ARAMA AĞACI
Düğüm geçişi
Recursive olarak inOrder
Uygulanmıştır.
4. İKİLİ ARAMA AĞACI
Düğüm geçişi
Ağaç kökten incelemeye
Başlansa dahi önce
yazdırılan değer en soldaki
Daha sonra ortadaki
en sonda ise sağdakidir.
Örnek 1
Aşağıdaki listelerden ikili arama ağaçları inşa
ediniz.
–
–
10 4 7 12 16 20 30 5 2 26 15
24 12 89 4 32 50 10 6 36 79 5 9 11
Örnek 2
Aşağıdaki ağacı; inorder, postorder, preorder
için diziniz
Örnek 3
Aşağıda preOrder
yöntemine göre
ekleme yapılmıştır
diğerlerine göre de
siz ekleyiniz.
Hafta 10
Düğüm arama
Sayma
–
–
Tek/çift
Yaprak düğüm
Toplama
–
Tek/çift
Yükseklik
Düğüm silme
1. DÜĞÜMÜN ARANMASI
node* search(node* &r, int data)
{
if (r==NULL)
return NULL;
else
if (r->data==data)
return r;
else
if (data<r->data)
return search (r->l,data);
else
if (data>r->data)
return seach(r->r,data);
}
1. DÜĞÜMÜN ARANMASI
H3
100
node* search(node* &r, int data)
{
if ( (r==NULL) || (r->data==data) )
return r;
else
if (data<r->data)
return search (r->l,data);
H20
H40
H20
H40
else
if (data>r->data)
return seach(r->r,data);
}
80
120
NULL NULL
NULL NULL
Node* S=search(r,80)
What does S stand for?
2. DÜĞÜMLERİN SAYILMASI
int count(struct tnode *p)
Without Recursion
{
if( p == NULL)
With Recursion
return(0);
else
if( p->lchild == NULL && p->rchild == NULL)
return(1);
// yaprak düğümlerin kontrolü
else
return(1 + (count(p->lchild) + count(p->rchild)));
// yaprak olmayan düğümlerin kontrolü
}
2. DÜĞÜMLERİN SAYILMASI
int count(struct tnode *p)
{
if( p == NULL)
return(0);
else
return(1 + (count(p->lchild) + count(p->rchild)));
}
Null olan düğümlere kadar gidilir (bir öncekinden bir adım daha fazla)
3. Bütün düğümlerin toplanması
int sum(node *p)
{
if( p == NULL)
return(0);
else
return( p->data+sum(p->l)+sum(p->r) );
}
Düğüm sayma mantığı ile aynı, tek değişen 1 yerine düğümün değeri ekleniyor
4. ÇİFT DEĞERLİ DÜĞÜMLERİN
SAYILMASI
int counteven(node* r)
{
if (r!=NULL)
if (r->data%2==0)
return 1+ counteven(r->l)+counteven(r->r);
else
return counteven(r->l)+counteven(r->r);
else
return 0;
}
5. ÇİFT DEĞERLİ DÜĞÜMLERİN
DEĞERİNİN TOPLANMASI
int counteven(node* r)
{
if (r!=NULL)
if (r->data%2==0)
????????????????????
else
????????????????????
else
return 0;
}
6. Yaprak düğümlerin sayılması
int countleaf(node* r)
{
if (r!=NULL)
if (r->l==NULL && r->r==NULL)
return 1;
else
return countleaf(r->l)+countleaf(r->r);
else
return 0;
}
6. Sadece 1 tane evladı olan
düğümlerin sayısı
int count1child(node* r)
{
if (r!=NULL)
if (????????????????????????????)
return 1+count1child(r->l)+count1child(r->r);
else
return count1child(r->l)+count1child(r->r);
else
return 0;
}
Cevap!!!
if ((r l==NULL && r r!=NULL) || (r l!=NULL && r r==NULL))
Burada XOR mantığı çalıştırılmalıdır.
6. İki evladı olan düğümlerin sayısı
int count2child(node* r)
{
if (r!=NULL)
if (????????????????????????)
return 1+count2child(r->l)+count2child(r->r);
else
return count2child(r->l)+count2child(r->r);
else
return 0;
}
Cevap!!!
if ((r l!=NULL && r r!=NULL))
Her iki dal da NULL olmamalıdır.
7. Bir düğümün yüksekliği
int Height (node* n)
{
if(n==NULL) return 0;
else return 1+max(Height (n->l)),
Height (n->r));
}
Height (n l) ve Height(n r) n==NULL olana kadar işletilir,
Bu işletim sonunda çıkan değerlerden maksimum olanı ağacın yüksekliğidir.

Benzer belgeler