4 / 4 / 0
Регистрация: 19.01.2014
Сообщений: 78
1

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

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

Author24 — интернет-сервис помощи студентам
почему не заполняется дерево?
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2021, 18:32
Ответы с готовыми решениями:

Почему не заполняется дерево?
Всё никак не могу заполнить дерево. Исходя из моих тестов, не создается даже корень. Вот мой код...

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

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

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

Почему массив заполняется разными числами?
Не могу понять, почему этот массив заполняется разными числами, если всем элементам присваивается...

2
2803 / 2313 / 701
Регистрация: 29.06.2020
Сообщений: 8,560
26.10.2021, 19:03 2
Цитата Сообщение от 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  [ТС] 3
надо, чтобы оно рекурсивно заполнялось - если 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
26.10.2021, 19:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2021, 19:25
Помогаю со студенческими работами здесь

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

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

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

Почему второй StringGrid заполняется нулями?
volvo, Здравствуйте, скажите пожалуйста почему второй StringGrid заполнятся нулями ? вот...

Почему свойство Caption панели не заполняется?
Почему при Form2-&gt;Panel1-&gt;Caption=&quot;Другое&quot;; на панели пусто? И почему при...

Бинарное дерево не заполняется
Делаю класс бинарного дерева Пытаюсь заполнить - корень остается пустым сам класс: template...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru