2010-02-20 3 views
2

Я использую эту библиотеку для хранения информации о структуре дерева: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), пересечет все узлы, ведущие к корню i.e 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()) или что-то вроде этого.

2

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

То, что я закончил с использованием в определении указатель на 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(); 
}