2013-02-10 2 views
0

Я реализую древовидную структуру в C++ с классом узла, как это:Пользовательские итератор на древовидной структуре в C++

class Node { 
protected: 
    // relations 
    Node *_parent; 
    std::vector<Node*> _children; 

public: 
    // some example method 
    void someMethod(Node *node) { 

     // do something with *node 

     for (int i = 0; i < node->_children; i++) { 
      _children[i]->myFunction; 
     } 
    } 
} 

Теперь, чтобы работать на узлах в моем дереве Я реализую рекурсивные функции, такие как someMethod в моем примере.

Работает, но в конечном итоге я записываю один и тот же рекурсивный код снова и снова для каждой новой функции, которая работает на моем дереве.

Есть ли общий способ итерации древовидной структуры, как я бы хотел на простом массиве? Некоторые методы, которые возвращают следующий объект, пока я не закончил всю ветвь.

EDIT:

Благодаря всем, кто комментируемые до сих пор, с вашей помощью я мог бы сузить проблему. Из моего понимания (я новичок в C++) мне нужен класс итератора, который инкапсулирует код для перемещения моего дерева.

Доступ всех членов дерева должны быть столь же простым, как:

for (Node<Node*>::iterator it = _node.begin(); it != _node.end(); ++it) { 
    Node *node = *it; 
    // do something with *node 
} 

Теперь вопрос:

Как реализовать такое итератор?

+0

как вы возвращаете 'mostSoFar' и в чем проблема? – ogzd

+0

, вы можете посмотреть это тоже: http://stackoverflow.com/questions/8961605/algorithm-for-creating-iterator-for-binarytree-class – M3taSpl0it

+0

@ogzd Я отредактировал свой вопрос, надеюсь, что теперь это яснее. –

ответ

1

Передайте указатель на функцию рекурсивной функции, которая возвращает искомый узел.

Это сила указателей функций и указателей функций в C/C++.

+0

Да, правильно. Я пропустил это в моем примере. Я действительно ищу более общую альтернативу рекурсивному подходу. Я отредактировал мой вопрос. –

0

Многие функции не просто перебирают по всем узлам, если дерево (обычно) сортировано, то для поиска наибольшего значения вы будете смотреть только в правом поддереве.

Если вы ищете минимальное значение в левом большинстве поддерева.

Поэтому не всегда имеет смысл иметь итератор, который выполняет итерацию всего дерева.
Но если вам нужно точно перебирать все узлы, вы можете использовать указатели на функции или шаблон посетителя (Erich Gamma, Design Patterns).

+0

Я хочу перебрать все узлы, как я бы, в простой массив. –

Смежные вопросы