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

Указатели в бинарном дереве

15.06.2019, 13:47. Показов 1387. Ответов 2

Здравствуйте.
Пытаюсь написать бинарное дерево и столкнулся с непонятным для меня поведением указателей.
Итак, у меня есть класс Node, который реализует узел в дереве
C++
1
2
3
4
5
6
7
8
class Node
{
...
    Node *l; //! Левый узел-потомок
    Node *r; //! Правый узел-потомок
    void setData(const std::string &newData) {data = newData;}
    inline const std::string& value() const {return data;}
}
И есть класс TreeController, который содержит методы для добавления/удаления узла, перехода на потомка и прочее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TreeController
{
...
    Node* createRoot(); //! Создать корневой узел
    Node* rootNode() const {return root;} //! Получить корень
    Node* currentNode() {return current;} //! Получить текущий узел
    inline void setData(const std::string &newData, Node* node) {node->setData(newData); }
    inline const std::string& getData() const {return current->value();}
...
    Node* goToLeftChild(Node* curNode = nullptr);
    Node* createLeftChild(Node* curNode);
...
    Node *root{nullptr};
    Node *current{root};
};
С int main() делаю так:
C++
1
2
3
4
5
6
7
8
 TreeController tc;
    Node *root = tc.createRoot();
    Node *сurrent = tc.currentNode();
    tc.setData("lol", current);
    std::cout << tc.getData();
    tc.createLeftChild(root);
    tc.setData("kek", current);
    std::cout << tc.getData();
Ожидаю, что root::data == lol, а current (который является левым потомком рута)::data == kek,
однако current по прежнему указывает на рута. Вот код метода, в котором создаю нового потомка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Node* TreeController::createLeftChild(Node* curNode)
{
    curNode->createLeftChild();
/*
Этот код содержится в классе Node в методе createLeftChild
    this->l = new Node;
    return l;
*/
    return goToLeftChild(curNode);
/* Код метода goToLeftChild
    if (curNode != nullptr)
        current = curNode;
 
    current = current->leftChild(); // Возвращает указатель на левого потомка
    return current;
*/
}
Теперь сам вопрос: почему current из int main до сих пор указывает на рута, ведь current внутри класса изменил свой адрес.
Пробовал с двойным указателем, но итог не изменился
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2019, 13:47
Ответы с готовыми решениями:

Строки в бинарном дереве
Есть шаблонный класс бинарного дерева. Со числами он работает нормально, но при добавлении строки в...

Поиск в бинарном дереве
Составить рекурсивную функцию для определения первого элемента, у которого совпадают старшая и...

Предок в бинарном дереве
Помогите пожалуйста! Необходимо написать программу, которая для двух вершин дерева определяет,...

Поиск в бинарном дереве
Привет всем! Нужно написать код, с которым в бинарном дереве можно найти заданное пользователем...

2
162 / 69 / 39
Регистрация: 28.05.2019
Сообщений: 239
15.06.2019, 19:02 2
Лучший ответ Сообщение было отмечено Салага2015 как решение

Решение

Цитата Сообщение от Салага2015 Посмотреть сообщение
почему current из int main до сих пор указывает на рута
Потому что ты ему присвоил текущий (которым был рут), а после добавления не переприсвоил
1
4 / 4 / 0
Регистрация: 06.05.2016
Сообщений: 71
15.06.2019, 19:43  [ТС] 3
Как и сказал elseecay, ошибка была в том, что я не переприсвоил указатель.
Беда в том, что до этого момента был уверен, что если current из класса изменит свой адрес, то current из int main поступит так же.
В общем, мне надо серьёзно подучить тему с указателями.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2019, 19:43
Помогаю со студенческими работами здесь

Поиск в Бинарном Дереве!
Задано бинарное дерево. Определить, есть ли в этом дереве хотя бы два одинаковых элемента....

Разобраться в бинарном дереве
Нашел вот такой вариант построения бинарного дерева. Просьба прокомментировать строки кода...

Количество листьев в бинарном дереве
Задача: Найти количество листьев в дереве. Собственно ввод и вывод дерева есть: #include...

Сумма элементов в бинарном дереве
Требуется реализовать функцию(void findSum(); ) которая определить сумму цифр в значениях тех...


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

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

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