//---------------------------------------------------------------------------
#include <clx.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
struct Leaf { //узел дерева
double data; //данные
Leaf *right, *left; //ссылки на детей
} *root, *maxtree; //корень основного дерева и максимального
double maxsum, sum; //максимальная и локальная суммы
void DeleteTree (Leaf* d) //очищение дерева
{
if (d!=NULL) {
DeleteTree (d->left);
DeleteTree (d->right);
delete d;
}
}
void CreateRoot (double data) //создание корня
{
if (root!=NULL) DeleteTree(root);
root = new Leaf;
root->data = data;
root->right = NULL;
root->left = NULL;
}
void Elem (Leaf* d, Leaf* a) //рекурсивное добавление элемента а
{
if (d->data!=a->data) {
if (d->data<a->data)
if (d->left!=NULL) Elem (d->left, a);
else d->left = a;
else if (d->right!=NULL) Elem (d->right, a);
else d->right = a;
}
}
void AddElem (double data) //добавление нового элемента в дерево
{
if (root==NULL) {CreateRoot (data); return;}
Leaf* a = new Leaf;
a->data = data;
a->left = NULL;
a->right = NULL;
Elem (root, a);
}
void RoundAboutSum (Leaf* d) //подсчёт суммы поддерева
{
if (d!=NULL) {
sum+=d->data; //сумма объявлена глобально
RoundAboutSum (d->left);
RoundAboutSum (d->right);
}
}
void RoundAbout (Leaf* d) //вычисление максимальной суммы перебором
{
if (d!=NULL) {
sum = 0;
RoundAboutSum (d); //ищем локальную и сравниваем с максимальной
if (sum>maxsum) {maxtree = d; maxsum = sum;}
RoundAbout (d->left);
RoundAbout (d->right);
}
}
void RoundAboutPrint (Leaf* d, int lev) //вывод дерева с корнем d
{
if (d!=NULL) {
for (int i=0; i<=lev; i++) cout << " ";
printf ("%3.3f\n", d->data);
RoundAboutPrint (d->left, lev+1);
RoundAboutPrint (d->right, lev+1);
}
}
int main(int argc, char* argv[])
{
root = NULL;
maxtree = NULL;
char ch = 'y';
double dt;
while (ch=='y') { //ввод данных
cout << "\nElement? ";
cin >> dt;
AddElem (dt);
cout << "\nContinue (y/n)? ";
ch = _getch();
}
cout << "\nTree:\n"; //вывод дерева
RoundAboutPrint (root, 0);
maxtree = root; maxsum = root->data; //берём за максимальное всё дерево
cout << "\nMax tree:\n"; //а за максимальную сумму первый элемент
RoundAbout (root);
RoundAboutPrint (maxtree, 0); //вывод результата
DeleteTree (root); //удаляем дерево
_getch();
return 0;
}
//---------------------------------------------------------------------------
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.