Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 0
Регистрация: 19.01.2014
Сообщений: 78

почему не заполняется дерево?

26.10.2021, 18:32. Показов 452. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
почему не заполняется дерево?
root = NULL

tree.h
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
#include <iostream>
#include <string>
 
class Node { 
public:
    Node() { 
        std::cout << "Node Constructor\n"; 
        left = NULL;
        right = NULL;
    };
    virtual ~Node() { 
        std::cout << "Node Destructor\n"; 
        Destroy();
    };
    void SetEngWord(std::string eng) { engWord = eng; }
    void SetRusWord(std::string rus) { rusWord = rus; }
    std::string GetEngWord() { return engWord; }
    std::string GetRusWord() { return rusWord; }
    Node* GetLeft() { return left; }
    Node* GetRight() { return right; }
    void SetLeft(Node* l) { left = l; }
    void SetRight(Node* r) { right = r; }
    void PrintWord() { std::cout << engWord << " - " << rusWord << std::endl; }
private:
    std::string engWord;
    std::string rusWord;
    Node* left;
    Node* right;
    void Destroy() {
        if (left != NULL) { left->Destroy(); delete left; }
        if (right != NULL) { right->Destroy(); delete right; }
        delete this;
    }
};
 
class Tree {
public:
    Tree() { 
        std::cout << "Tree Constructor\n"; 
        root = NULL;
    };
    virtual ~Tree() { 
        std::cout << "Tree Destructor\n"; 
    };
    void Add(std::string eng, std::string rus);
    void AddNode(Node* src, Node* n);
    Node* Search(std::string s);
private:
    Node* root;
};
tree.cpp
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
#include "stdafx.h"
#include "Tree.h"
#include <string>
 
void Tree::Add(std::string eng, std::string rus) {
    Node* n = new Node;
    n->SetEngWord(eng);
    n->SetRusWord(rus);
    AddNode(root, n);
}
 
void Tree::AddNode(Node* src, Node* n) {
    if (src == NULL) {
        src = n; return; }
    if (n->GetEngWord() < src->GetEngWord()) { AddNode(src->GetLeft(), n); }
        else  { AddNode(src->GetRight(), n); }
}
 
Node* Tree::Search(std::string s) {
    Node* n;
    n = root;
    while(true) {
        if (n == NULL) break;
        if (n->GetEngWord() < s) n = n->GetLeft();
        if (n->GetEngWord() > s) n = n->GetRight();
        if (n->GetEngWord() == s) break;
    }
    return n;
}
program.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <iostream>
#include "Tree.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"Russian");
 
    Tree tree;
    tree.Add("a","aa");
    tree.Add("b","bb");
    tree.Add("c","cc");
    Node* n = tree.Search("b");
    if (n != NULL) n->PrintWord();
 
 
    std::cin.get(); std::cin.get();
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.10.2021, 18:32
Ответы с готовыми решениями:

Почему не заполняется дерево?
Всё никак не могу заполнить дерево. Исходя из моих тестов, не создается даже корень. Вот мой код заполнения: if (root = 0) { Tree...

Почему не заполняется список?
void HashTable::insert(int student_number, std::string f_name, std::string m_name, std::string l_name, std::string debts) { ...

Почему некорректно заполняется структура?
1-й вариант #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; struct { uint16_t bfType; ...

2
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.10.2021, 19:03
Цитата Сообщение от meo Посмотреть сообщение
void Tree::AddNode(Node* src, Node* n)
C++
1
void Tree::AddNode(Node *& src, Node* n)
Добавлено через 1 минуту
На данный момент src лишь копия указателя.
Разве в вашем дереве нету поля root ?

Добавлено через 1 минуту
Есть. Тогда можно вот так. без изменения объявления метода.
C++
1
2
    if (src == NULL) {
        root = n; return;
Добавлено через 1 минуту
А вообще метод AddNode крайне небезопасный.

Добавлено через 51 секунду
Переписать заново.
0
4 / 4 / 0
Регистрация: 19.01.2014
Сообщений: 78
26.10.2021, 19:25  [ТС]
надо, чтобы оно рекурсивно заполнялось - если root=null, то заполняется root, а потом root->GetLeft() или root->GetRight(). но они нигде не присваиваются, так что неправильно

при Node *& src
AddNode(src->GetLeft(), n);
ошибка error C2664: 'Tree::AddNode' : cannot convert parameter 1 from 'Node *' to 'Node *&'

Добавлено через 4 минуты
не работает
src = root только на первой итерации, а вообще функция рекурсивная

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Tree::AddNode(Node* src, Node* n, bool left) {
    if (src == NULL) {
        src = n; 
        if (src->GetParent() != NULL) {
            if (left) src->GetParent()->SetLeft(n);
                else  src->GetParent()->SetRight(n);
            }
        return; 
    }
    if (n->GetEngWord() < src->GetEngWord()) { 
        if (src->GetLeft() == NULL) src->SetLeft(n);
        src->GetLeft()->SetParent(src);
        AddNode(src->GetLeft(), n, true); 
    }
    else  { 
        if (src->GetRight() == NULL) src->SetRight(n);
        src->GetRight()->SetParent(src);
        AddNode(src->GetRight(), n, false); 
    }
}
Добавлено через 15 минут
не работает

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
void Tree::Add(std::string eng, std::string rus) {
    Node* n = new Node;
    n->SetEngWord(eng);
    n->SetRusWord(rus);
    AddNode(root,NULL,n,true);
}
 
void Tree::AddNode(Node* src, Node* parent, Node* n, bool left) {
    if (src == NULL) {
        src = n; 
        if (src->GetParent() == NULL) {
            src->SetParent(parent);
            if (left) src->GetParent()->SetLeft(n);
                else  src->GetParent()->SetRight(n);
        }
        return; 
    }
    if (n->GetEngWord() < src->GetEngWord()) { 
        AddNode(src->GetLeft(), src, n, true); 
    }
    else  { 
        AddNode(src->GetRight(), src, n, false); 
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2021, 19:25
Помогаю со студенческими работами здесь

Почему не заполняется массив vector?
Здравствуйте! Не могу понять, почему не заполняется массив vector.. Он в классе объявлен типа public. #include...

Почему массив заполняется разными числами?
Не могу понять, почему этот массив заполняется разными числами, если всем элементам присваивается значение 1... const int N = 200; ...

В общем, не пойму почему криво заполняется массив
#include &quot;stdafx.h&quot; #include &quot;time.h&quot; #include &quot;stdlib.h&quot; int _tmain(int argc, _TCHAR* argv) { const int N = 10, MIN = -5,...

почему stringgrid заполняется сам
Почему поля в stringgrid заполняются сами неизвестными цифрами //...

Почему ProgressBar заполняется не полностью?
Всем привет ! Есть примерно такой код void __fastcall TForm1::Button1Click(TObject *Sender) { for(double...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru