O‘ZBEKISTON RESPUBLIKASI AXBOROT TEXNOLOGIYALARI VA
KOMMUNIKATSIYALARINI RIVOJLANTIRISH VAZIRLIGI
MUHAMMAD AL-XORAZMIY NOMIDAGI
TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI
Fan
Ma’lumotlar tuzilmasi va algoritmlari
LABORATORIYA ISHI № 6
MAVZU:
DARAXTSIMON
MA’LUMOTLAR
TUZILMASINI
TADQIQ QILISH
Guruh:
415 - 19
Bajardi:
Ma’rufjonov O
Tekshirdi:
Bo’riyev Y
Toshkent–2020
Nazariy qism
Binar daraxtining tuzilishi
Daraxt - bu uning har bir tuguni nol yoki bir- necha bolaga ega bo‘lgan
iyerarxik tuzilmadir.
Daraxt tuzilmasi quyidagi ko‘rinishda bo‘lishi mumkin:
Bu daraxt oila tuzilmasini ifoda etmoqda. Daraxt tugunlari odamlarni
ifodalamoqda, chiziqlar esa ular orasidagi bog‘lanishni. Bu turdagi maʼlumotlarni
saqlash uchun daraxt tuzilmasi eng qulay tuzilma hisoblanadi.
Ikkilik (Binar) daraxt
Binar daraxt yuqorida ko‘rsatilgan daraxtga o‘xshaydi, lekin baʼzi qoidalarga
asosan quriladi:
Har bir tugundagi bolalar soni 2 tadan oshmasligi zarur
Xar qanday tugun qiymatidan kichik bo‘lgan qiymat chap farzandga
yoki chap farzandning chap farzandiga yoziladi
Xar qanday tugun qiymatidan katta bo‘lgan qiymat o‘ng farzandga
yoki ong farzandning o‘ng farzandiga yoziladi
Keling shu qoidalar asosida qurilgan daraxtni ko‘raylik:
Ahamiyat bering, bosh tugun (8)dan chapdagi barcha elementlarning qiymatlari
sakkizdan kichik undan o‘ngdagisi esa sakkizdan katta. Bu qoidalar daraxtning xar
bir tuguniga tegishli.
Keling daraxt bo‘sh bo‘lgandan boshlab qanday qurilganini qarab chiqamiz.
Birinchi navbatda 8 ni qo‘shamiz. Dastlab daraxt bo‘sh bo‘lgani sabab u bosh
tugun hisoblanadi. Undan keyin 4 ni qo‘shamiz. 8 dan 4 kichik bo‘lgani uchun
tepadagi qoidalarga amal qilgan xolda 4 ni 8 ning chap tomoniga yozamiz. 8
ning hech qanday farzandi bo‘lmagani uchun 4 shu joyda qoladi.
Endi 2 kiritamiz. Maʼlumki 2 dan 8 katta, shu sabab chapga yuramiz. Chapda
allaqachon qiymat borligi sabab chap farzand qiymati 2 bilan solishtiriladi. Chap
farzandning qiymati (4) 2 dan kata bo‘lgani sabab 4 ning chap tomoni qaraladi. 4
ning chap tomonida element bo‘lmagani sabab 2 shu joyga joylashtiriladi. Shunday
qilib kiritilgan xar bir element uchun yuqoridagi solishtiruvlar qaytariladi.
Daraxtdan element olib tashlash
Daraxt elementini o‘chirish oddiy tuyulishi mumkin, lekin hisobga olish kerak
bo‘lgan holatlari mavjud.
Algoritmning umumiy ko‘rinishi quyidagicha:
Qiymatga mos elementni topish
Uni o‘chirish
Biz berilgan qiymatga mos qiymatni topganimizdan keyin biz 3- xil holatga duch
kelishimiz mumkin.
1 – Holat: O‘chirilishi lozim bo‘lgan elementning o‘ng farzandi mavjud emas.
Bu holatda biz, shunchaki chap farzandni o’chirilgan element o’rniga ko’chiramiz.
Natijada yuqoridagi daraxt quyidagi ko’rinishga keladi:
2 – Holat: O’chirilishi lozim bo’lgan elementning faqat o’ng farzandi mavjud va
o’z navbatida bu farzandning chap tomonida element mavjud emas.
Bu holatda o’chirilgan element o’rniga o’ng farzand (6) ko’chiriladi. Natijada
daraxt quyidagi ko’rinishga keladi:
3 – Holat: O’chirilayotgan elementning o’ng farzandi mavjud va bu farzandning
chap farzandi mavjud:
Bu holatda o‘chirilgan element o‘rinini eng chapdagi element egallaydi yaʼni 6. Bunga sabab
element o‘chirilganda tuzilma o‘z xususiyatlarini saqlab qolishi zarur yaʼni tugunning chap
tomonida undan kichik, o‘ng tomonida esa undan katta qiymat joylashishi kerak. Natija:
Masala sharti
13-tartib raqam
Binar daraxtning barcha barglari yozuvini chop etuvchi dastur ishlab chiqing
Dastur kodi:
/*
Ma'rufjonov Obidjon
Binar daraxtning barcha barglari yozuvini
chop etuvchi dastur ishlab chiqing.
*/
#include
using namespace std;
struct Daraxt_bargi
{
int sanalar;
struct Daraxt_bargi *chap, *ong;
};
void Daraxt_bargi_chiqarish(Daraxt_bargi *ildiz)
{
if (!ildiz)
return;
if (!ildiz->chap && !ildiz->ong)
{
cout << ildiz->sanalar << " ";
return;
}
if (ildiz->chap)
Daraxt_bargi_chiqarish(ildiz->chap);
if (ildiz->ong)
Daraxt_bargi_chiqarish(ildiz->ong);
}
Daraxt_bargi* newDaraxt_bargi(int sanalar)
{
Daraxt_bargi *temp = new Daraxt_bargi;
temp->sanalar = sanalar;
temp->chap = temp->ong = NULL;
return temp;
}
int main()
{
Daraxt_bargi *ildiz = newDaraxt_bargi(199);
ildiz->chap = newDaraxt_bargi(432);
ildiz->ong = newDaraxt_bargi(323);
ildiz->chap->chap = newDaraxt_bargi(564);
ildiz->ong->chap = newDaraxt_bargi(875);
ildiz->ong->ong = newDaraxt_bargi(988);
ildiz->ong->chap->chap = newDaraxt_bargi(667);
ildiz->ong->chap->ong = newDaraxt_bargi(987);
ildiz->ong->ong->chap = newDaraxt_bargi(943);
ildiz->ong->ong->ong = newDaraxt_bargi(1000);
cout << "Berilgan daraxt shu holatda " << endl << endl;
cout << setw(15) << "199" << endl << setw(11) << "*" <<
setw(8) << "*" << endl << setw(8) << "432" << setw(15) << "323"
<< endl << setw(4) << "*" << setw(15) << "*" << setw(8) << "*"
<< endl << "564" << setw(14) << "875" << setw(14) << "907"
<< endl << setw(11) << "*" << setw(8) << "*" << setw(8) << "*"
<< setw(8) << "*" << endl << setw (11) << "667" << setw(8)
<< "987" << setw (8) << "943" << setw(8) <<"1000" << endl << endl;
cout << "Daraxt barglari qiymatlari " << endl;
Daraxt_bargi_chiqarish(ildiz);
return 0;
}
Natija
Do'stlaringiz bilan baham: |