Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
HanteR
1 / 1 / 0
Регистрация: 23.10.2009
Сообщений: 53
1

Довести до ума программу про бинарному дереву

06.12.2010, 17:39. Просмотров 500. Ответов 6
Метки нет (Все метки)

Здравствуйте. Помогите пожалуйста привести до ума задачу:
организовать бинарное дерево по заданной последовательности и функцию включения элемента в это дерево. Результат напечатать при прохождении дерева в прямом порядке.

Вот что у меня имеется:
* Функция которая за заданным массивом организовывает бинарное дерево:
C++
1
2
3
4
5
6
7
8
9
10
11
12
bntrp build (int a[], int n)
{   bntrp p;
    int c;
    p = NULL;
   if (n) {  c = n/2;
               p = (bntrp) calloc (1, sizeof (bntrn));
               p->val = a[c];
               p->l = build (&a[0], c);
               p->r = build (&a[c+1], n-c-1);
            }
   return p;
}
* Функция включения элемента в это дерево:
C++
1
2
3
4
5
6
bntrp insert (bntrp p, int d)
{ if (!p) return new(d);
   if (p->val > d) p->l = insert(p->l, d);
     else p->r = insert(p->r, d);
   return p;
}
помогите соединить все это, что-бы работало. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2010, 17:39
Ответы с готовыми решениями:

Подключение к бинарному дереву списка
Вот есть такой вот код. Не могу подключить к моему узлу бинарного дерева ...

Поиск по бинарному дереву целочисленных значений
Здравствуйте! Очень нужна помощь данном, надеюсь что простом, задании. Заранее...

Итератор для обхода по бинарному дереву
Кхм. Попытался реализовать итератор для обхода по бинарному дереву......

Надо довести программу до ума (найти произведение главной и побочной диагоналей матрицы)
программа компилируется но не считает что нужно. (я новичок так что не судите...

довести до ума курсовую
задание:программное моделирование международной телефоной станции. указание.на...

6
Vladimir.
158 / 158 / 48
Регистрация: 24.11.2009
Сообщений: 375
06.12.2010, 18:45 2
C++
1
 if (!p) return new(d);
поясните, что вы делаете в этой строке.
0
HanteR
1 / 1 / 0
Регистрация: 23.10.2009
Сообщений: 53
06.12.2010, 20:46  [ТС] 3
Цитата Сообщение от Vladimir. Посмотреть сообщение
C++
1
 if (!p) return new(d);
поясните, что вы делаете в этой строке.
я взял эти примеры из лабораторных
0
Vladimir.
158 / 158 / 48
Регистрация: 24.11.2009
Сообщений: 375
06.12.2010, 21:37 4
если оператор new не перегружен (а в лабораторной это скорее всего так) то строка должна быть чем-то вроде:

if (!p) return *(new bntrp(d));

так же не очень понятно зачем создавать узлы дерева через calloc, если есть тот же new, не понимаю этой хитрости, разве что для инициализации полей bntrp нулями..
0
HanteR
1 / 1 / 0
Регистрация: 23.10.2009
Сообщений: 53
06.12.2010, 21:43  [ТС] 5
а можете сделать программу так, как Вы правильным?
0
Vladimir.
158 / 158 / 48
Регистрация: 24.11.2009
Сообщений: 375
07.12.2010, 07:20 6
Я бы начал с того что описал бы класс дерево, а потом постепенно добавлял к нему функционал.
Что-то вроде такого для начала:
код
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<time.h>
#include<stdlib.h>
 
#include<iostream>
struct nodes{
    int     data;
 
    nodes*  left;
    nodes*  right;
};
class trees{
    private:
        nodes*  root; // старший предок. начало дерева.
    
        nodes*  add_node(int data, nodes* ptr);
        void    traverse_show(nodes* ptr);
    
    public:
        trees() {root = NULL;}
        ~trees(){};
        
        void    add(int data);
        void    show() {traverse_show(root);}
};
 
void trees::add(int data){ 
    
    if (root != NULL){ add_node(data, root); return;}
    
    root = add_node(data, root);
}
 
nodes* trees::add_node(int x,nodes* p){
    if(p == NULL){ //возникает в случае пустого дерева.
        p = new nodes;
        p->left = NULL;
        p->right = NULL;
        p->data = x;    
        return p;
    }
    
    if((x > p->data)&&(p->right == NULL)){ //правый лист.
        p->right = new nodes;
        p->right->right = NULL;
        p->right->left = NULL;
        p->right->data = x;
        return p->right;
    }
    else if((x <= p->data)&&(p->left == NULL)){ //левый лист.
        p->left = new nodes;
        p->left->left = NULL;
        p->left->right = NULL;
        p->left->data = x;
        return p->left;
    }
    else{ //спускаемся по дереву
    p = (p->data <= x)? p->left : p->right; // ключ - данные.
    return (add_node(x, p)); 
    }
    
}
1
HanteR
1 / 1 / 0
Регистрация: 23.10.2009
Сообщений: 53
07.12.2010, 17:16  [ТС] 7
Цитата Сообщение от Vladimir. Посмотреть сообщение
Я бы начал с того что описал бы класс дерево, а потом постепенно добавлял к нему функционал.
Что-то вроде такого для начала:
код
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<time.h>
#include<stdlib.h>
 
#include<iostream>
struct nodes{
    int     data;
 
    nodes*  left;
    nodes*  right;
};
class trees{
    private:
        nodes*  root; // старший предок. начало дерева.
    
        nodes*  add_node(int data, nodes* ptr);
        void    traverse_show(nodes* ptr);
    
    public:
        trees() {root = NULL;}
        ~trees(){};
        
        void    add(int data);
        void    show() {traverse_show(root);}
};
 
void trees::add(int data){ 
    
    if (root != NULL){ add_node(data, root); return;}
    
    root = add_node(data, root);
}
 
nodes* trees::add_node(int x,nodes* p){
    if(p == NULL){ //возникает в случае пустого дерева.
        p = new nodes;
        p->left = NULL;
        p->right = NULL;
        p->data = x;    
        return p;
    }
    
    if((x > p->data)&&(p->right == NULL)){ //правый лист.
        p->right = new nodes;
        p->right->right = NULL;
        p->right->left = NULL;
        p->right->data = x;
        return p->right;
    }
    else if((x <= p->data)&&(p->left == NULL)){ //левый лист.
        p->left = new nodes;
        p->left->left = NULL;
        p->left->right = NULL;
        p->left->data = x;
        return p->left;
    }
    else{ //спускаемся по дереву
    p = (p->data <= x)? p->left : p->right; // ключ - данные.
    return (add_node(x, p)); 
    }
    
}
спасибо. а можно программу целиком?
0
07.12.2010, 17:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2010, 17:16

Глобальный хук. Довести до ума
Здравствуйте, решил изучить механизмы хуков, почитал статьи. Появились вопросы....

Помагите довести исходник до ума
Здраствуйте дорогой форум! я новичек в этом деле , нашел исходник на c++...

в чем ошибка,как довести до ума
Дан массив чисел В. Найти сумму положительных и отрицательных чисел массива с...


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

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

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