Задача этой книги дать краткое и четкое изложение языка С++ в соответствии со стандар том iso/iec 14882. Она предназначена для студентов, изучающих язык «с нуля»



Download 2 Mb.
bet74/232
Sana29.03.2022
Hajmi2 Mb.
#516205
TuriЗадача
1   ...   70   71   72   73   74   75   76   77   ...   232
Bog'liq
Т. А. Павловская C C . Программирование на языке высокого уровня

Бинарные деревья


Áèíaðíîå äåðåâî — ýòî äèíaìè÷åñêaя ñòðóêòóða äaííûõ, ñîñòîяùaя èç óçëîâ, êa- æäûé èç êîòîðûõ ñîäåðæèò, êðîìå äaííûõ, íå áîëåå äâóõ ññûëîê ía ðaçëè÷íûå áèíaðíûå äåðåâüя. Ía êaæäûé óçåë èìååòñя ðîâíî îäía ññûëêa. Ía÷aëüíûé óçåë íaçûâaåòñя nîðíåì äåðåâa.
Ía ðèñóíêå 3.3 ïðèâåäåí ïðèìåð áèíaðíîãî äåðåâa (êîðåíü îáû÷íî èçîáðaæaåòñя ñâåðõó, âïðî÷åì, êíèãó ìîæíî è ïåðåâåðíóòü)1. Óçåë, íå èìåþùèé ïîääåðåâüåâ, íaçûâaåòñя ëèñòîì. Èñõîäяùèå óçëû íaçûâaþòñя ïðåäêaìè, âõîäяùèå — ïîòîì- êaìè. Âûñîòa äåðåâa îïðåäåëяåòñя êîëè÷åñòâîì óðîâíåé, ía êîòîðûõ ðañïîëaãa- þòñя åãî óçëû.
Åñëè äåðåâî îðãaíèçîâaíî òaêèì îáðaçîì, ÷òî äëя êaæäîãî óçëa âñå êëþ÷è åãî ëå- âîãî ïîääåðåâa ìåíüøå êëþ÷a ýòîãî óçëa, a âñå êëþ÷è åãî ïðaâîãî ïîääåðåâa — áîëüøå, îíî íaçûâaåòñя äåðåâîì ïîèñna. Îäèíaêîâûå êëþ÷è íå äîïóñêaþòñя.  äåðåâå ïîèñêa ìîæíî íaéòè ýëåìåíò ïî êëþ÷ó2, äâèãaяñü îò êîðíя è ïåðåõîäя


1 Íóæíî íå çaáûâaòü î òîì, ÷òî â îïåðaòèâíîé ïaìяòè я÷åéêè ðañïîëîæåíû ëèíåéíî ïî âîçðañòaíèþ aäðåñîâ, a äåðåâî — ýòî òîëüêî ìåòîä ëîãè÷åñêîé îðãaíèçaöèè äaííûõ.
2 Äëя òaê íaçûâaåìîãî ñáaëaíñèðîâaííîãî äåðåâa, â êîòîðîì êîëè÷åñòâî óçëîâ ñïðaâa è ñëå- âa îòëè÷aåòñя íå áîëåå ÷åì ía åäèíèöó, âûñîòa äåðåâa ðaâía äâîè÷íîìó ëîãaðèôìó êîëè-
÷åñòâa óçëîâ. Ëèíåéíûé ñïèñîê ìîæíî ïðåäñòaâèòü êaê âûðîæäåííîå áèíaðíîå äåðåâî, â êîòîðîì êaæäûé óçåë èìååò íå áîëåå îäíîé ññûëêè. Äëя ñïèñêa ñðåäíåå âðåìя ïîèñêa ðaâíî ïîëîâèíå äëèíû ñïèñêa.


ía ëåâîå èëè ïðaâîå ïîääåðåâî â çaâèñèìîñòè îò çía÷åíèя êëþ÷a â êaæäîì óçëå. Òaêîé ïîèñê ãîðaçäî ýôôåêòèâíåå ïîèñêa ïî ñïèñêó, ïîñêîëüêó âðåìя ïîèñêa îïðåäåëяåòñя âûñîòîé äåðåâa, a îía ïðîïîðöèîíaëüía äâîè÷íîìó ëîãaðèôìó êî- ëè÷åñòâa óçëîâ.

30














8














1




















21










Рис. 3.3. Бинарное дерево

Äåðåâî яâëяåòñя ðåêóðñèâíîé ñòðóêòóðîé äaííûõ, ïîñêîëüêó êaæäîå ïîääåðåâî òaêæå яâëяåòñя äåðåâîì. Äåéñòâèя ñ òaêèìè ñòðóêòóðaìè èçяùíåå âñåãî îïèñû- âaþòñя ñ ïîìîùüþ ðånóðñèâíûõ aëãîðèòìîâ. Íaïðèìåð, ôóíêöèþ îáõîäa âñåõ óç- ëîâ äåðåâa â îáùåì âèäå ìîæíî îïèñaòü òaê:


funCtiOn way_arOund ( äåðåâî ){ way_arOund ( ëåâîå ïîääåðåâî ) ïîñåùåíèå êîðíя
way_arOund ( ïðaâîå ïîääåðåâî )
}
Ìîæíî îáõîäèòü äåðåâî è â äðóãîì ïîðяäêå, íaïðèìåð, ñía÷aëa êîðåíü, ïîòîì ïîääåðåâüя, íî ïðèâåäåííaя ôóíêöèя ïîçâîëяåò ïîëó÷èòü ía âûõîäå îòñîðòèðî- âaííóþ ïîñëåäîâaòåëüíîñòü êëþ÷åé, ïîñêîëüêó ñía÷aëa ïîñåùaþòñя âåðøèíû ñ ìåíüøèìè êëþ÷aìè, ðañïîëîæåííûå â ëåâîì ïîääåðåâå. Ðåçóëüòaò îáõîäa äåðå- âa, èçîáðaæåííîãî ía ðèñ. 3.3:
1, 6, 8, 10, 20, 21, 25, 30

Åñëè â ôóíêöèè îáõîäa ïåðâîå îáðaùåíèå èäåò ê ïðaâîìó ïîääåðåâó, ðåçóëüòaò îáõîäa áóäåò äðóãèì:


30, 25, 21, 20, 10, 8, 6, 1
Òaêèì îáðaçîì, äåðåâüя ïîèñêa ìîæíî ïðèìåíяòü äëя ñîðòèðîâêè çía÷åíèé. Ïðè îáõîäå äåðåâa óçëû íå óäaëяþòñя.
Äëя áèíaðíûõ äåðåâüåâ îïðåäåëåíû îïåðaöèè:

  • âêëþ÷åíèя óçëa â äåðåâî;

  • ïîèñêa ïî äåðåâó;

  • îáõîäa äåðåâa;

  • óäaëåíèя óçëa.

Äëя êaæäîãî ðåêóðñèâíîãî aëãîðèòìa ìîæíî ñîçäaòü åãî íåðåêóðñèâíûé ýêâèâa- ëåíò.  ïðèâåäåííîé íèæå ïðîãðaììå ðåaëèçîâaía íåðåêóðñèâíaя ôóínöèя ïîèñ- na ïî äåðåâó ñ ânëþ÷åíèåì è ðåêóðñèâíaя ôóíêöèя îáõîäa äåðåâa. Ïåðâaя ôóíê- öèя îñóùåñòâëяåò ïîèñê ýëåìåíòa ñ çaäaííûì êëþ÷îì. Åñëè ýëåìåíò íaéäåí, îía âîçâðaùaåò óêaçaòåëü ía íåãî, a åñëè íåò — âêëþ÷aåò ýëåìåíò â ñîîòâåòñòâóþùåå ìåñòî äåðåâa è âîçâðaùaåò óêaçaòåëü ía íåãî. Äëя âêëþ÷åíèя ýëåìåíòa íåîáõîäè- ìî ïîìíèòü ïðîéäåííûé ïî äåðåâó ïóòü ía îäèí øaã íaçaä è çíaòü, âûïîëíяåòñя ëè âêëþ÷åíèå íîâîãî ýëåìåíòa â ëåâîå èëè ïðaâîå ïîääåðåâî åãî ïðåäêa1.
Ïðîãðaììa ôîðìèðóåò äåðåâî èç ìaññèâa öåëûõ ÷èñåë è âûâîäèò åãî ía ýêðaí.
inClude struCt NOde{
int d;
NOde *left;
NOde *right;
};
NOde * first(int d);
NOde * searCh_insert(NOde *rOOt, int d); vOid print_tree(NOde *rOOt, int l);
//------------------------------------------------
int main(){
int b[] = {10, 25, 20, 6, 21, 8, 1, 30};
NOde *rOOt = first(b[0]);
fOr (inti= 1; i<8; i++) searCh_insert(rOOt, b[i]); print_tree(rOOt, 0);
return 0;
}
//------------------------------------------------
// Ôîðìèðîâaíèå ïåðâîãî ýëåìåíòa äåðåâa NOde * first(int d){
NOde *pv = new NOde;


1 «Äîâîëüíî åñòåñòâåííî èñïûòûâaòü íåêîòîðîå íåäîâåðèå ê aëãîðèòìó ïîèñêa ïî äåðåâó ñ âêëþ÷åíèåì» — Í. Âèðò, aâòîð êëaññè÷åñêîé êíèãè «Àëãîðèòìû + ñòðóêòóðû äaííûõ = ïðîãðaììû» [8].

pv->d = d; pv->left = 0;


pv->right = 0; return pv;
}
//------------------------------------------------
// Ïîèñê ñ âêëþ÷åíèåì
NOde * searCh_insert(NOde *rOOt, int d){ NOde *pv= rOOt, *prev;
bOOl fOund = false; while (pv&& !fOund){
prev= pv;
if (d == pv->d) fOund = true; else if (d < pv->d) pv = pv->left;
else pv = pv->right;
}
if (fOund) return pv;
// Cîçäaíèå íîâîãî óçëa:
NOde *pnew = new NOde; pnew->d = d;
pnew->left = 0;
pnew->right = 0; if (d < prev->d)
// Ïðèñîåäèíåíèå ê ëåâîìó ïîääåðåâó ïðåäêa: prev->left = pnew;
else
// Ïðèñîåäèíåíèå ê ïðaâîìó ïîääåðåâó ïðåäêa: prev->right = pnew;
return pnew;
}
//------------------------------------------------
// Îáõîä äåðåâa
vOid print_tree(NOde *p, int level){ if (p){
print_tree(p->left, level + 1); // âûâîä ëåâîãî ïîääåðåâa fOr (inti= 0; iCOut << p->d << endl; // âûâîä êîðíя ïîääåðåâa print_tree(p->right, level + 1); // âûâîä ïðaâîãî ïîääåðåâa
}
}
Òåêóùèé óêaçaòåëü äëя ïîèñêa ïî äåðåâó îáîçía÷åí pv, óêaçaòåëü ía ïðåäêa pv
îáîçía÷åí prev, ïåðåìåííaя pnew èñïîëüçóåòñя äëя âûäåëåíèя ïaìяòè ïîä âêëþ-
÷aåìûé â äåðåâî óçåë. Ðåêóðñèè óäaëîñü èçáåæaòü, ñîõðaíèâ âñåãî îäíó ïåðåìåí- íóþ (prev) è ïîâòîðèâ ïðè âêëþ÷åíèè îïåðaòîðû, îïðåäåëяþùèå, ê êaêîìó ïîä- äåðåâó ïðèñîåäèíяåòñя íîâûé óçåë.

Ðåçóëüòaò ðaáîòû ïðîãðaììû äëя äåðåâa, èçîáðaæåííîãî ía ðèñ. 3.3:


1
6
8
10
20
21
25
30
Ðaññìîòðèì ïîäðîáíåå ôóínöèþ îáõîäa äåðåâa. Âòîðûì ïaðaìåòðîì â íåå ïåðåäa- åòñя öåëaя ïåðåìåííaя, îïðåäåëяþùaя, ía êaêîì óðîâíå íaõîäèòñя óçåë. Êîðåíü íaõîäèòñя ía óðîâíå 0. Äåðåâî ïå÷aòaåòñя ïî ãîðèçîíòaëè òaê, ÷òî êîðåíü íaõî- äèòñя ñëåâa (ïîñìîòðèòå ía ðåçóëüòaò ðaáîòû ïðîãðaììû, íaêëîíèâ ãîëîâó âëå- âî, è ñðaâíèòå ñ ðèñ. 3.3). Ïåðåä çía÷åíèåì óçëa äëя èìèòaöèè ñòðóêòóðû äåðåâa âûâîäèòñя êîëè÷åñòâî ïðîáåëîâ, ïðîïîðöèîíaëüíîå óðîâíþ óçëa. Åñëè çaêîì- ìåíòèðîâaòü öèêë ïå÷aòè ïðîáåëîâ, îòñîðòèðîâaííûé ïî âîçðañòaíèþ ìaññèâ áó- äåò âûâåäåí â ñòîëáèê. Çaìåòüòå, ÷òî ôóíêöèя îáõîäa äåðåâa äëèíîé âñåãî â íå- ñêîëüêî ñòðîê ìîæåò íaïå÷aòaòü äåðåâî ëþáîãî ðaçìåða — âaæíî òîëüêî ñëåäèòü,
÷òîáû ðåêóðñèâíûå âûçîâû íå ïåðåïîëíèëè ñòåê.
Óäaëåíèå óçëa èç äåðåâa ïðåäñòaâëяåò ñîáîé íå òaêóþ ïðîñòóþ çaäa÷ó, ïîñêîëüêó óäaëяåìûé óçåë ìîæåò áûòü êîðíåâûì, ñîäåðæaòü äâå, îäíó èëè íè îäíîé ññûëêè ía ïîääåðåâüя. Äëя óçëîâ, ñîäåðæaùèõ ìåíüøå äâóõ ññûëîê, óäaëåíèå òðèâèaëü- íî. ×òîáû ñîõðaíèòü óïîðяäî÷åííîñòü äåðåâa ïðè óäaëåíèè óçëa ñ äâóìя ññûëêa- ìè, åãî çaìåíяþò ía óçåë ñ ñaìûì áëèçêèì ê íåìó êëþ÷îì. Ýòî ìîæåò áûòü ña- ìûé ëåâûé óçåë åãî ïðaâîãî ïîääåðåâa èëè ñaìûé ïðaâûé óçåë ëåâîãî ïîääåðåâa (íaïðèìåð, ÷òîáû óäaëèòü èç äåðåâa ía ðèñ. 3.3 óçåë ñ êëþ÷îì 25, åãî íóæíî çaìå- íèòü ía 21 èëè 30, óçåë 10 çaìåíяåòñя ía 20 èëè 8, è ò. ä.). Ðåaëèçaöèя ôóíêöèè óäaëåíèя èç äåðåâa îñòaâëåía ÷èòaòåëþ äëя ñaìîñòîяòåëüíîé ðaáîòû.



Download 2 Mb.

Do'stlaringiz bilan baham:
1   ...   70   71   72   73   74   75   76   77   ...   232




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish