C++ TCL (библиотека контейнеров дерева): как пройти по дереву от узла прямо к корню

Я использую эту библиотеку для хранения информации о древовидной структуре:

http://www.datasoftsolutions.net/tree_container_library/overview.php

Вот упрощенная версия моего кода C++:

#include "tcl/sequential_tree.h"

// Node has some data which is not important now

typedef sequential_tree<Node> gametree_t;
typedef sequential_tree<Node>::iterator gametree_iter;

int main() {
    gametree_t gametree;
    gametree_iter gametree_it;

    gametree_it = gametree.insert(Node(0));
    gametree_it->insert(Node(1));
    gametree_it->insert(Node(2));

    gametree_it = gametree_it->insert(Node(3));
    gametree_it->insert(Node(4));

    gametree_it = gametree_it->insert(Node(5));
    gametree_it->insert(Node(6));

    return 1;
}

Дерево выглядит так

0
|_ 1
|_ 2
|_ 3
  |_4
  |_5
    |_6

Я пытаюсь сделать функцию, которая с учетом узла (6) будет проходить через все узлы, ведущие к корню, то есть 6,5,3,0. Это мой первый проект на C++, и у меня проблемы с пониманием указателей. Вероятно, это несколько строк C++, но я пытаюсь сделать это в течение нескольких часов безуспешно. Любая помощь будет оценена.

что-то вроде этого работает, но оно должно работать со многими уровнями, а не только с 4:

gametree_it->get()->get_value();
gametree_it->parent()->get()->get_value();
gametree_it->parent()->parent()->get()->get_value();
gametree_it->parent()->parent()->parent()->get()->get_value();

2 ответа

Решение

Общий метод - использовать что-то вроде этого

Node tmp = gametree_it;
while (tmp->parent() != NULL) {
     tmp = tmp->parent();
}
root = tmp->get();

Может быть, вы должны использовать while (tmp->has_parent()) или что-то в этом роде.

Отто был прав:)

В итоге я использовал указатель на gametree. А затем пройдитесь по узлам, используя метод ->is_root().

gametree_t* gametree_p;

gametree_p = gametree_it.node();   // gets current node
while (!gametree_p->is_root()) {
   cout << gametree_p->get()->get_value() << endl;
   gametree_p = gametree_p->parent();
}
Другие вопросы по тегам