Mustaqil ish fan: Diskret tuzulmalar Tayyorladi: Ergashov Maqsud Qarshi-2021 Mavzu


Daraxtga yangi element qo‘shish funksiyasi|



Yüklə 66,79 Kb.
səhifə2/4
tarix24.12.2023
ölçüsü66,79 Kb.
#160658
1   2   3   4
Mustaqil ish -8 Daraxtlarni Prufer usulida kodlash. Daraxtlarni ularning kodi bo\'yicha yasash.

4.7. Daraxtga yangi element qo‘shish funksiyasi|
Daraxtga biror bir elementni qo’shishdan oldin daraxtda berilgan kalit bo’yicha qidiruvni amalga oshirish lozim bo’ladi. Agar berilgan kalitga teng kalit mavjud bo’lsa, u holda dastur o’z ishini yakunlaydi, aks holda daraxtga element qo’shish amalga oshiriladi. Daraxtga yangi yozuvni kiritish uchun, avvalo daraxtning shunday tugunini topish lozimki, natijada mazkur tugunga yangi element qo’shish mumkin bo’lsin. Kerakli tugunni qidirish algoritmi ham xuddi berilgan kalit bo’yicha tugunni topish algoritmi kabi bo’ladi.
Daraxtda qo’shilayotgan element kalitiga teng kalitli element yo’q bo’lgan holda elementni tuzilmaga qo’shish funksiyasini keltirib o’tamiz.

Node *q=NULL;


Node *p=tree;
while(p!=NULL){
q=p;
if(key==p->key){
search=p;
return 0;}
If(key
key) p=p->left;
else p=p->right;}

Berilgan kalitga teng tugun topilmadi, element qo’shish talab qilinadi. Ota bo’lishi mumkin tugunga q ko’rsatkich beriladi, elementning o’zi esa yangi nomli ko’rsatkichi bilan beriladi.
node *q=new node;

Qo’yilayotgan yangi element chap yoki o’ng o’g’il bo’lishini aniqlash lozim.
If(keykey) q->left=yangi;

else q->right=yangi;

search=yangi;

return 0;



5.8. Binar daraxtdan elementni ochirish funksiyasi
Tugunni o’chirib tashlash natijasida daraxtning tartiblanganligi buzilmasligi lozim.
Tugun daraxtda o’chirilayotganda 3 xil variant bo’lishi mumkin:
1) Topilgan tugun terminal (barg). Bu holatda tugun otasining qaysi tomonida turgan bo’lsa, otasining o’sha tomonidagi shoxi o’chiriladi va tugunning xotirada joylashgan sohasi tozalanadi.
2) Topilgan tugun faqatgina bitta o’g’ilga ega. U holda o’g’il ota o’rniga joylashtiriladi.
3) O’chirilayotgan tugun ikkita o’g’ilga ega. Bunday holatda shunday qism daraxtlar zvenosini topish lozimki, uni o’chirilayotgan tugun o’rniga qo’yish mumkin bo’lsin. Bunday zveno har doim mavjud bo’ladi:
- bu yoki chap qism daraxtning eng o’ng tomondagi elementi (ushbu zvenoga erishish uchun keyingi uchiga chap shox orqali o’tib, navbatdagi uchlariga esa, murojaatNULL bo’lmaguncha, faqatgina o’ng shoxlari orqali o’tish zarur);
- yoki o’ng qism daraxtning eng chap elementi (ushbu zvenoga erishish uchun keyingi uchiga o’ng shox orqali o’tib, navbatdagi uchlariga esa, murojaat NULL bo’lmaguncha, faqatgina chap shoxlari orqali o’tish zarur).
O’chirlayotgan element chap qism daraxtining eng o’ngidagi element o’chirilayotgan element uchun merosxo’r bo’ladi ( 12 uchun – 11 bo’ladi). Merosxo’r esa o’ng qism daraxtning eng chapidagi tuguni (12 uchun - 13).
Merosxo’rni topish algoritmini ishlab chiqaylik (4.8-rasmga qarang).


p – ishchi ko’rsatkich;

q - p dan bir qadam orqadagi ko’rsatkich;

v – o’chirilayotgan tugun merosxo’rini ko’rsatadi;

t – v dan bir qadam orqada yuradi;

s - v dan bir qadam oldinda yuradi (chap o’g’ilni yoki bo’sh joyni ko’rsatib boradi).


5.8-rasm. Binar daraxtdan oraliq tugunni o’chirich tartibi
Yuqoridagi daraxt bo’yicha qaraydigan bo’lsak, oxir oqibatda, v ko’rsatkich 13 tugunni, s esa bo’sh joyni ko’rsatishi lozim.
1) Elementni qidirish funksiyasi orqali o’chirilayotgan elementni topamiz. p ko’rsatkich o’chirilayotgan elementni ko’rsatadi.
2) O’chiriladigan elementning o’rniga qo’yiluvchi tugunga v ko’rsatkich qo’yamiz.

node *del(node *tree,int key){

node *p=new node;

node *next=tree;

node *q=NULL;

while(next!=NULL)

{ if (next->info==key){cout<<"Binar daraxtda "<

if (next->info>key){ q=next; next=next->left; }

else {q=next;next=next->right;}

}

if(next==NULL) cout<<"tuzilmada izlangan element yo’q!!!"<



node *v=NULL,*t=NULL,*s=NULL;

if(p->left==NULL)v=p->right;

else

if(p->right==NULL) v=p->left;



if((p->left!=NULL)&&(p->right!=NULL)){t=p; v=p->right; s=v->left;}

while(s!=NULL){

t=v;

v=s;


s=v->left;

}

if((t!=NULL)&&(t!=p)){



t->left=v->right;

v->right=p->right;

v->left=p->left;

}

if(t==p) v->left=p->left;



if(q==NULL){

cout

tree=v;

delete(p);

return tree;

}

if(p==q->left)



q->left=v;

else q->right=v;

delete(p); // o’chirilgan element joylashgan xotira yacheykasini tozalash

return tree;

}

5.9. Daraxtni muvozanatlash algoritmi


Yüklə 66,79 Kb.

Dostları ilə paylaş:
1   2   3   4




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə