Консультация № 177777
09.04.2010, 20:22
38.38 руб.
0 2 1
Доброго времени суток, уважаемые эксперты!
Требуется Ваша помощь в написании программы (среда Borland C++ Builder 6.0)
Задача. Написать программу для работы с бинарным деревом, содержащим вещественные числа. Программа должна обеспечивать создание дерева и печать поддерева с наибольшей суммой элементов.
Заранее спасибо.

Обсуждение

Неизвестный
13.04.2010, 22:41
общий
Botsman:
Не совсем поняла по поводу поиска поддерева, посмотрите, так должно быть?
Код:
//---------------------------------------------------------------------------

#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;
}
//---------------------------------------------------------------------------
Неизвестный
14.04.2010, 01:31
общий
это ответ
Здравствуйте, Botsman.
Примерно так. Стандартное бинарное дерево без использования ключей, поддерево с максимальной суммой ищется перебором через с использованием глобальных переменных для суммирования, надеюсь, я правильно поняла это условие.
Если что-то иначе следовало сделать или нужны более подробные разъяснения, обращайтесь.
Удачи!

Приложение:
//---------------------------------------------------------------------------

#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;
}
//---------------------------------------------------------------------------
5
Все ОК, даже больше чем достаточно. Спасибо!!!
Форма ответа