Добро пожаловать,

�аши партнеры
Книги-online
Ëàáîðàòîðíàÿ ðàáîòà ¹8
Ëàáîðàòîðíàÿ ðàáîòà ¹8
Äâîè÷íûå äåðåâüÿ
Öåëü ðàáîòû:
Èçó÷èòü ñïîñîáû ýôôåêòèâíîãî õðàíåíèÿ è îáðàáîòêè èíôîðìàöèè íà ïðèìåðå áèíàðíûõ äåðåâüåâ.
Îáùèå ñâåäåíèÿ
Áèíàðíîå äåðåâî - ýòî èåðàðõè÷åñêàÿ äèíàìè÷åñêàÿ ñòðóêòóðà äàííûõ, ñîñòîÿùàÿ èç óçëîâ è ñîåäèíÿþùèõ èõ äóã.  êàæäûé óçåë, êðîìå îäíîãî, âåäåò ðîâíî îäíà äóãà. Ýòîò åäèíñòâåííûé óçåë íàçûâàåòñÿ êîðíåì äåðåâà.
Ñ êàæäîé âåðøèíîé äåðåâà ñâÿçûâàåòñÿ êîíå÷íîå ÷èñëî îòäåëüíûõ äåðåâüåâ, íàçûâàåìûõ ïîääåðåâüÿìè. Íà ðèñóíêå èçîáðàæåíî äåðåâî, â óçëàõ êîòîðîãî ðàñïîëàãàþòñÿ ñèìâîëû:
Âåðøèíà Y, íàõîäÿùàÿñÿ íåïîñðåäñòâåííî íèæå âåðøèíû X, íàçûâàåòñÿ íåïîñðåäñòâåííûì ïîòîìêîì X, à âåðøèíà X íàçûâàåòñÿ ïðåäêîì Y.
Åñëè âåðøèíà íå èìååò ïîòîìêîâ, òî îíà íàçûâàåòñÿ ëèñòîì, åñëè èìååò, òî íàçûâàåòñÿ âíóòðåííåé âåðøèíîé.
Íàïðèìåð, âåðøèíû D, E ÿâëÿþòñÿ íåïîñðåäñòâåííûìè ïîòîìêàìè âåðøèíû B; âåðøèíû H, I, J ÿâëÿþòñÿ ëèñòüÿìè.
Î÷åâèäíî, ÷òî äëÿ îïèñàíèÿ äåðåâà òðåáóþòñÿ ññûëêè. Îïèøåì áèíàðíîå äåðåâî êàê ñòðóêòóðó òèïà Record, ñîäåðæàùóþ êàê ìèíèìóì äâà ïîëÿ – óêàçàòåëè íà ëåâîå è ïðàâîå ïîääåðåâüÿ, è ïîëå äàííûõ, íàïðèìåð òèïà Integer:
Type
PTree = ^TTree;
TTree = Record
Data : Integer;
Left, Right : PTree;
end;
Êîðåíü äåðåâà îïèñûâàåòñÿ ññûëî÷íîé ïåðåìåííîé:
Var
Tree : PTree;
Îñíîâíûå îïåðàöèè íàä äåðåâîì
Ê îñíîâíûì îïåðàöèÿì íàä äåðåâüÿìè îòíîñÿòñÿ:
• çàíåñåíèå ýëåìåíòà â äåðåâî;
• îáõîä äåðåâà;
• óäàëåíèå ýëåìåíòà èç äåðåâà.
Ïðèìåðû
Âñòàâêà ýëåìåíòà â äåðåâî.
Ñîçäàòü è âûâåñòè íà ýêðàí äåðåâî, ýëåìåíòû êîòîðîãî ââîäÿòñÿ ñ êëàâèàòóðû è èìåþò öåëûé òèï. Ïðè÷åì äëÿ êàæäîé âåðøèíû äåðåâà âî âñåõ ëåâûõ âåðøèíàõ äîëæíû íàõîäèòüñÿ ÷èñëà ìåíüøèå, à â ïðàâîé áîëüøèå, ÷åì ÷èñëà, õðàíÿùèåñÿ â ýòîé âåðøèíå. Òàêîå äåðåâî íàçûâàåòñÿ äåðåâîì ïîèñêà.
Îïèøåì ïðîöåäóðó âñòàâêè â äåðåâî íîâîé âåðøèíû. Ïðè âñòàâêå â äåðåâî âåðøèíà âñòàâëÿåòñÿ ëèáî êàê ïîääåðåâî óæå ñóùåñòâóþùåé âåðøèíû èëè êàê åäèíñòâåííàÿ âåðøèíà äåðåâà. Ïîýòîìó è ëåâàÿ, è ïðàâàÿ ñâÿçè íîâîé âåðøèíû äîëæíû áûòü ðàâíû nil. Êîãäà äåðåâî ïóñòî, çíà÷åíèå ïåðåäàâàåìîé â âèäå ïàðàìåòðà ññûëêè ðàâíî nil.  ýòîì ñëó÷àå íóæíî èçìåíèòü åå òàê, ÷òîáû îíà óêàçûâàëà íà íîâóþ âåðøèíó, êîòîðàÿ áûëà âñòàâëåíà êàê êîðíåâàÿ. Ïðè âñòàâêå âòîðîãî ýëåìåíòà ïåðåäàííûé èç îñíîâíîé ïðîãðàììû ïàðàìåòð ANode óæå íå áóäåò ðàâåí nil, è íàäî ïðèíèìàòü ðåøåíèå î òîì, â êàêîå ïîääåðåâî íåîáõîäèìî âñòàâèòü íîâóþ âåðøèíó.
Procedure InsTree(var ANode : PTree; n : lnteger);
Begin
if ANode = nil then
Begin
new (ANode);
With ANode^ do
Begin
Left := nil;
Right := nil;
Data := n;
end;
end
else if n< ANode^.Data then InsTree(ANode^.Left, n) else InsTree(ANode^.Right, n);
End;
Âûâîä ýëåìåíòîâ äåðåâà.
Îïèøåì ïðîöåäóðó âûâîäà çíà÷åíèé ýëåìåíòîâ äâîè÷íîãî äåðåâà íà ýêðàí. Äëÿ ýòîãî íåîáõîäèìî âûïîëíèòü ïîëíûé îáõîä äåðåâà. Ïðè îáõîäå äåðåâà åãî îòäåëüíûå âåðøèíû ïîñåùàþòñÿ â îïðåäåëåííîì ïîðÿäêå. Âûâîä äâîè÷íîãî äåðåâà ìîæíî ïðîèçâîäèòü ðåêóðñèâíî, âûïîëíÿÿ äëÿ êàæäîé âåðøèíû òðè äåéñòâèÿ:
• âûâîä ÷èñëà, õðàíÿùåãîñÿ â óçëå;
• îáõîä ëåâîãî ïîääåðåâà;
• îáõîä ïðàâîãî ïîääåðåâà.
Ïîðÿäîê âûïîëíåíèÿ ýòèõ äåéñòâèé îïðåäåëÿåò ñïîñîá îáõîäà äåðåâà. Ñïîñîáû îáõîäà:
• ïðÿìîé îáõîä (ñâåðõó âíèç);
• ñèììåòðè÷íûé îáõîä (ñëåâà íàïðàâî);
• îáðàòíûé îáõîä (ñíèçó ââåðõ).
Ïðîöåäóðà ñèììåòðè÷íîãî âûâîäà äåðåâà èìååò ñëåäóþùèé âèä:
Procedure PrintTree(ANode : PTree);
Begin
if ANode <> nil then
Begin
PrintTree(ANode^.Left);
WriteLn (ANode^.Data);
PrintTree(ANode^.Right)
End;
End;
Îñíîâíàÿ ïðîãðàììà îñóùåñòâëÿåò ââîä ÷èñåë ñ êëàâèàòóðû. Èñïîëüçóþòñÿ: ïåðåìåííàÿ Tree òèïà PTree – çíà÷åíèå óêàçàòåëÿ íà êîðåíü äåðåâà; ïåðåìåííàÿ Digit òèïà Integer äëÿ õðàíåíèÿ î÷åðåäíîãî ââåäåííîãî ÷èñëà.
Var
Tree : PTree;
Digit : Integer;
BEGIN {îñíîâíàÿ ïðîãðàììà}
Writeln (‘Îêîí÷àíèå ââîäà – 0’);
Tree := nil;
Read(Digit);
While Digit<>0 Do
Begin
InsTree(Tree,Digit);
Write (‘Ââåäèòå î÷åðåäíîå ÷èñëî: ‘);
ReadLn (Digit);
End;
PrintTree(Tree);
END.
Óäàëåíèå èç äåðåâà.
Íåïîñðåäñòâåííîå óäàëåíèå ýëåìåíòà èç óïîðÿäî÷åííîãî äåðåâà ðåàëèçóåòñÿ äîñòàòî÷íî ïðîñòî, åñëè ýòà âåðøèíà ÿâëÿåòñÿ êîíå÷íîé:
èëè èç íåå âûõîäèò òîëüêî îäíî ðåáðî:
Äëÿ ýòîãî íóæíî èçìåíèòü ñîîòâåòñòâóþùóþ ññûëêó ó ïðåäøåñòâóþùåé âåðøèíû.
Åñëè æå èç óäàëÿåìîé âåðøèíû âûõîäèò äâå âåòâè, òî íóæíî íàéòè ïîäõîäÿùóþ âåðøèíó äåðåâà, êîòîðóþ ìîæíî áûëî áû âñòàâèòü íà ìåñòî óäàëÿåìîé âåðøèíû.  ýòîì ñëó÷àå óäàëÿåìûé ýëåìåíò íóæíî çàìåíèòü ëèáî íà ñàìûé ïðàâûé ýëåìåíò åãî ëåâîãî ïîääåðåâà, ëèáî íà ñàìûé ëåâûé ýëåìåíò åãî ïðàâîãî ïîääåðåâà. Òàêèå ýëåìåíòû íå ìîãóò èìåòü áîëåå îäíîãî ïîòîìêà.
Ïóñòü çàäàíà ñëåäóþùàÿ ñòðóêòóðà:
Type
PTree = ^TTree;
TTree = Record
Data : Integer;
Left, Right : PTree;
end;
Var
Tree : PTree;
Íåîáõîäèìî óäàëèòü èç äåðåâà Tree óçåë ñî çíà÷åíèåì ïîëÿ Data=x.
 ïðîöåäóðå DeleteNode ðàçëè÷àþòñÿ òðè ñëó÷àÿ:
1. Óçëà ñî çíà÷åíèå, ðàâíûì õ, íåò.
2. Óçåë ñî çíà÷åíèåì õ èìååò íå áîëåå îäíîãî ïîòîìêà.
3. Óçåë ñî çíà÷åíèåì õ èìååò äâóõ ïîòîìêîâ.
Procedure DeleteNode(x : Integer; var ANode : PTree);
Var q : PTree;
Procedure Del(var R : PTree);
Begin
if R^.Right <> nil then Del(R.^Right)
else
begin
q^.Data := R^.Data;
q := R;
R := R^.Left;
Dispose(q);
end;
End; { Del }
Âegin { DeleteTree }
if ANode = nil then Writeln (‘Ýëåìåíòà ñ êëþ÷îì ’,x,’ â äåðåâå íåò’)
else
if x < ANode^.Data then DeleteNode(x,ANode^.Left)
else if x > ANode^.Data then DeleteNode(x,ANode^.Right)
else
begin
q := ANode;
if q^.Right = nil then
Begin
ANode := q^.Left;
Dispose(q);
end
else
if q^.Left = nil then
begin
ANode := q^.Right;
Dispose(q);
end
else Del(q^.Left);
end;
End;
Âñïîìîãàòåëüíàÿ ïðîöåäóðà Del âûçûâàåòñÿ òîëüêî â òðåòüåì ñëó÷àå. Îíà «ñïóñêàåòñÿ» âäîëü ñàìîé ïðàâîé âåòâè ëåâîãî ïîääåðåâà óäàëÿåìîãî óçëà q^ è çàòåì çàìåíÿåò äàííûå (ïîëå Data) â q^ ñîîòâåòñòâóþùèìè çíà÷åíèÿìè ñàìîãî ïðàâîãî óçëà R^ ýòîãî ëåâîãî ïîääåðåâà, ïîñëå ÷åãî îò R^ ìîæíî îñâîáîäèòüñÿ.
Íà ðèñóíêå çàäàíî íà÷àëüíîå äåðåâî (à), èç êîòîðîãî ïîñëåäîâàòåëüíî óäàëÿþòñÿ óçëû ñî çíà÷åíèÿìè 13, 15, 5, 10. Ïîëó÷åííûå äåðåâüÿ ïîêàçàíû íà ðèñ. b – e.
Êîíòðîëüíûå âîïðîñû
1. ×òî òàêîå ðåêóðñèâíûé àëãîðèòì?
2. Èç êàêèõ ÷àñòåé ñòðîèòñÿ îïðåäåëåíèå ðåêóðñèâíîãî àëãîðèòìà?
3. ×òî ÿâëÿåòñÿ îáÿçàòåëüíûì â ëþáîì ðåêóðñèâíîì àëãîðèòìå?
4. Ìîæíî ëè ðåêóðñèþ çàìåíèòü èòåðàöèåé? Ìîæíî ëè èòåðàöèþ çàìåíèòü ðåêóðñèåé?
5. Êàêîâ ïðèíöèï ïîñòðîåíèÿ äèíàìè÷åñêîé ñòðóêòóðû «äåðåâî»?
6. Ïåðå÷èñëèòå ñõîäñòâà è îòëè÷èÿ äèíàìè÷åñêèõ ñòðóêòóð òèïà «ëèíåéíûé ñïèñîê», «ñòåê», «äåðåâî».
7. Ïåðå÷èñëèòå ñòðóêòóðû, êîòîðûå ìîæíî ïðåäñòàâèòü â âèäå äåðåâà, êîòîðûå âñòðå÷àþòñÿ â ïîâñåäíåâíîé æèçíè.
8. Çàêîí÷èòå ôðàçó: «Ñïèñîê – ýòî äåðåâî, â êîòîðîì …».
Çàäà÷è
Âî âñåõ çàäà÷àõ ïîäðàçóìåâàþòñÿ äåðåâüÿ äâîè÷íîãî ïîèñêà.
1. Íàïèñàòü ðåêóðñèâíóþ ÷èñëîâóþ ôóíêöèþ, ïîäñ÷èòûâàþùóþ ñóììó ýëåìåíòîâ äåðåâà.
2. Íàïèñàòü ôóíêöèþ, êîòîðàÿ íàõîäèò íàèáîëüøèé ýëåìåíò äåðåâà.
3. Íàïèñàòü ôóíêöèþ, êîòîðàÿ íàõîäèò íàèìåíüøèé ýëåìåíò äåðåâà.
4. Íàïèøèòå ïðîöåäóðó, êîòîðàÿ óäàëÿåò èç äåðåâà âñå ÷åòíûå ýëåìåíòû.
5. Íàïèñàòü ðåêóðñèâíóþ ïðîöåäóðó, êîòîðàÿ îïðåäåëÿåò ÷èñëî âõîæäåíèé çàäàííîãî ýëåìåíòà â äåðåâî.
6. Íàïèñàòü ðåêóðñèâíóþ ïðîöåäóðó, êîòîðàÿ ïå÷àòàåò ýëåìåíòû èç âñåõ ëèñòüåâ äåðåâà.
7. Íàïèñàòü ïðîöåäóðó, êîòîðàÿ âûâîäèò íà ýêðàí äåðåâî, ïîêàçûâàÿ ãëóáèíó óçëîâ îòñòóïîì îò ëåâîãî êðàÿ ýêðàíà. Íàïðèìåð, äåðåâî
áóäåò âûâåäåíî òàê:
1 ãðóïïà
1 êóðñ
2 ãðóïïà
ÔÌÈ
3 ãðóïïà
2 êóðñ
4 ãðóïïà
8. Íàïèñàòü ðåêóðñèâíóþ ôóíêöèþ, êîòîðàÿ îïðåäåëÿåò ãëóáèíó çàäàííîãî ýëåìåíòà íà äåðåâå è âîçâðàùàåò –1, åñëè òàêîãî ýëåìåíòà íåò.
9. Íàïèñàòü ïðîöåäóðó, êîòîðàÿ ïå÷àòàåò (ïî îäíîìó ðàçó) âñå âåðøèíû äåðåâà.
10. Íàïèñàòü ïðîöåäóðó, êîòîðàÿ ïî çàäàííîìó n ñ÷èòàåò ÷èñëî âñåõ âåðøèí ãëóáèíû n â çàäàííîì äåðåâå.
11. Íàïèñàòü ïðîöåäóðó, êîòîðàÿ ñ÷èòàåò ãëóáèíó äåðåâà.
12. Îòñîðòèðîâàòü ìàññèâ À ïóòåì âêëþ÷åíèÿ åãî ýëåìåíòîâ â äåðåâî è ñêîïèðîâàòü îòñîðòèðîâàííûå äàííûå îáðàòíî â À.
13. Çàäàíà ïîñëåäîâàòåëüíîñòü ñëîâ. Îïðåäåëèòü ÷àñòîòó âõîæäåíèÿ êàæäîãî èç ñëîâ â ïîñëåäîâàòåëüíîñòü.
Óêàçàíèå. Äëÿ ðåøåíèÿ çàäà÷è ëþáîå ñëîâî èùåòñÿ â äåðåâå, êîòîðîå íà íà÷àëüíîì ýòàïå ïóñòî. Åñëè ñëîâî íàéäåíî, òî ñ÷åò÷èê åãî âõîæäåíèé óâåëè÷èâàåòñÿ íà åäèíèöó, åñëè íåò, òî ñëîâî âêëþ÷àåòñÿ â äåðåâî ñ åäèíè÷íûì çíà÷åíèåì ñ÷åò÷èêà.
Íàçàä
Íà ãëàâíóþ
Внимание! Е�ли у ва� не получило�ь найти нужную информацию, и�пользуйте
рубрикатор или во�пользуйте�ь
пои�ком .
книги по программированию и�ходники компоненты шаблоны �айтов C++ PHP Delphi �качать