Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mordol
1 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 294
#1

Постройте и выведите на экран бинарное дерево. Найдите произведение элементов дерева, находящихся на уровне u - C++

09.04.2016, 07:33. Просмотров 410. Ответов 3
Метки нет (Все метки)

Я построил дерево вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# include <iostream>
# include <conio.h>
#include <clocale>
using namespace std;
 
//Наша структура
struct node
{
    int info; //Информационное поле
    node *l, *r;//Левая и Правая часть дерева
};
 
node * tree=NULL; //Объявляем переменную, тип которой структура Дерево
 
/*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
void push(int a,node **t)
{
    if ((*t)==NULL) //Если дерева не существует
    {
        (*t)=new node; //Выделяем память
        (*t)->info=a; //Кладем в выделенное место аргумент a
        (*t)->l=(*t)->r=NULL; //Очищаем память для следующего роста
        return; //Создали корень, выходим
    }
       //Дерево есть
        if (a>(*t)->info) push(a,&(*t)->r); /*Если аргумент а больше чем текущий элемент, кладем его вправо */
        else push(a,&(*t)->l); //Иначе кладем его влево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
void print (node *t,int u) 
{
    if (t==NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
    print(t->l,++u);//С помощью рекурсивного посещаем левое поддерево
    for (int i=0;i<u;++i) cout<<"|";
    cout<<t->info<<endl; //И показываем элемент
    u--;
    }
    print(t->r,++u); //С помощью рекурсии посещаем правое поддерево
}
 
void main ()
{   setlocale(LC_ALL,"RUS");
    int n; //Количество элементов
    int s; //Число, передаваемое в дерево
    cout<<"введите количество элементов  ";
    cin>>n; //Вводим количество элементов
 
    for (int i=0;i<n;++i)
    {
    cout<<"ведите число  ";
    cin>>s; //Считываем элемент за элементом
   
    push(s,&tree); //И каждый кладем в дерево
    }
    cout<<"наше дерево\n";
    print(tree,0);
    system("pause")`;       
}
Вот в чем проблема в какую часть кода нужно вставить цикл для вычисления произведения элементов дерева?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2016, 07:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Постройте и выведите на экран бинарное дерево. Найдите произведение элементов дерева, находящихся на уровне u (C++):

Бинарное дерево, расчёт суммы элементов дерева - C++
Задание: Программа должна обрабатывать бинарное дерево, содержащее целые числа. Дополнительные функции: расчёт суммы элементов дерева.

Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой - C++
Дано бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой.

Бинарное Дерево(обход дерева) - C++
добрый вечер всем!) в универе задали написать бинарное дерево со всеми видами обхода и т.п. я их написал.. но еще дали 1 вывод его надо...

Выведите массив на экран и найдите количество элементов, значение которых равно нулю - C++
&quot;Данный двухмерный массив размерностью 5X4. Заполните его случайными числами с интервала -20 .. 20: 1. Выведите массив на экран и...

В новом массиве найдите и выведите на экран сумму элементов, порядковый номер которых делится на 3 - C++
Элементы случайно заполненного одномерного массива d преобразуйте по формуле d = exp(i/d). В новом массиве найдите и выведите на экран...

Бинарное дерево С++ (функция проверки внутренних узлов дерева) - C++
Здравствуйте. Помогите пожалуйста. Надо написать функцию,проверяющую есть ли в дереве внутренний узел, у которого только один потомок. ...

3
Serg_o_Grey
76 / 76 / 27
Регистрация: 29.03.2016
Сообщений: 348
09.04.2016, 07:40 #2
вам нужна глобальная переменная которая будет хранить произведение, и соответсвующее условие при обходе (что, мол, если мы находимся на уровне u, тогда умножаем его на глобальную переменную)
0
mordol
1 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 294
09.04.2016, 08:27  [ТС] #3
Цитата Сообщение от Serg_o_Grey Посмотреть сообщение
вам нужна глобальная переменная которая будет хранить произведение, и соответсвующее условие при обходе (что, мол, если мы находимся на уровне u, тогда умножаем его на глобальную переменную)
можете написать как строчка условия будет выглядеть в моем случае?
0
Serg_o_Grey
76 / 76 / 27
Регистрация: 29.03.2016
Сообщений: 348
09.04.2016, 18:50 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# include <iostream>
# include <conio.h>
using namespace std;
 
struct node
{
    int info;
    node *l, *r;
};
 
int x = 1;
node* tree = NULL;
node* first = NULL;
bool flag = true;
 
void push(node *t, node *f, int u, int h, int current_h);
void treeprint(node *t, int c, int u, int h);
void bypass(node *t, int c, int u);
void create_tree();
 
void push(node *t, node *f, int u, int h, int current_h)
{
    if (current_h < u)
    {
        if (current_h == u - 1)
        {
            if (flag == true)
            {
                if (t->l == NULL)
                {
                    t->l = new node;
                    t->l->l = NULL;
                    t->l->r = NULL;
                    cout << endl << "Введите очередное число: ";
                    cin >> t->l->info;
                    system("cls");
                    for (int i = 0; i <= u; i++) 
                    {
                        treeprint(f, 0, i, h);
                        cout << endl;
                    }
                    flag = false;
                }
                else
                {
                    if (t->r == NULL)
                    {
                        t->r = new node;
                        t->r->l = NULL;
                        t->r->r = NULL;
                        cout << endl << "Введите очередное число: ";
                        cin >> t->r->info;
                        system("cls");
                        for (int i = 0; i <= u; i++) 
                        {
                            treeprint(f, 0, i, h);
                            cout << endl;
                        }
                        flag = false;
                    }
                }
            }
        }
        else
        {
            if (t->l != NULL) push(t->l, f, u, h, current_h + 1);
            if (t->r != NULL) push(t->r, f, u, h, current_h + 1);
        }
    }
}
 
void treeprint(node *t, int c, int u, int h)    // c - счетчик глубины; u - уровень, которого нужно достичь; h - всего уровней
{
    int k = 0;
    if (c == u)
    {
        for (int i = h; i > c; i--) k = ((k + 1) * 2) - 1;
        for (int i = 0; i < k; i++) cout << "\t";
        cout << t->info << "\t";
        for (int i = 0; i <= k; i++) cout << "\t";
    }
    else
    {
        if (t->l != NULL) treeprint(t->l, c + 1, u, h);
        if (t->r != NULL) treeprint(t->r, c + 1, u, h);
    }
}
 
void bypass(node *t, int c, int u)
{
    if (c == u) x *= t->info;
    if (t->l != NULL) bypass(t->l, c + 1, u);
    if (t->r != NULL) bypass(t->r, c + 1, u);
}
 
void create_tree()
{
    int n;
    cout << "Введите кол-во элементов:  ";
        cin >> n;
    system("cls");
    int width = 1;
    int heigth = 0;
    for (int i = 0;;i++)
    {
        heigth += width;
        if (n <= heigth) {heigth = i; break;}
        else width *= 2;
    }
    tree = new node;
    tree->l = tree->r = NULL;
    cout << endl << "Введите первое число: ";
    cin >> tree->info;
    system("cls");
    treeprint(tree, 0, 0, heigth);
    cout << endl;
    first = tree;
    int k = 1;
    int s = 0;
    for (int i = 1; i <= n; i++)
    {
        flag = true;
        if (i > k) 
        {
            k = ((k+1) * 2) - 1;
            s++;
        }
        push(tree, first, s, heigth, 0);
    }
}
 
int main ()
{   
    setlocale(LC_ALL,"RUS");
    create_tree();
    bypass(tree, 0, 1);
    cout << endl  << "Произведение: " << x << endl;
    cin.get();
}


попробуйте сначала для 7 элементов (иначе не влезет в консоль дерево)

Добавлено через 3 минуты
ну или консоль увеличьте
1
09.04.2016, 18:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2016, 18:50
Привет! Вот еще темы с ответами:

Бинарное дерево. Обход бинарного дерева (симметрический, прямой и обратный) - C++
Привет всем! Мне надо в курсовой работе написать программу, которая строит бинарное дерево (по вводимым значениям) и потом обходит это...

Бинарное дерево (передать адрес первого (корневого) элемента дерева в метод) - C++
Добрый день! Такой вопрос: Реализован шаблонный класс - бинарное дерево. Создан метод прохождения по элементам с помощью рекурсии. Не...

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру - C++
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...

Вывести на экран бинарное дерево - C++
здравствуйте, написал алгоритм сортированного бинарного дерева (меньшие слева, большие справа) само дерево в классе, не смог понять как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru