У меня есть график, который я пересекаю, используя типичный шаблон посетителей. Я столкнулся с проблемой, когда мне нужно знать, посещался ли посещаемый узел во время текущего обхода.
Я разработал решение, которое, я думаю, будет работать, но оно потребует создания и уничтожения "флагов" узлов во время / после обхода графа.
То есть при посещении каждого узла проверяется член указателя объекта флага в узле. Если он равен NULL, посетитель создаст объект флага и назначит его указателю объекта флага узла. Затем посетитель помещает ссылку на член указателя флага в свой собственный внутренний список (конечно, указателей для пометки указателей объектов). В противном случае, если указатель объекта флага узла не равен NULL, посетитель останавливает обход на этом узле.
В этом случае очистка будет заключаться в выталкивании / удалении объектов флага из списка посетителей после завершения обхода и переназначении каждого указателя флага узла в списке на NULL.
Это немного запутанно и кажется мне потенциально склонным к утечкам, но у меня нет лучших идей ...
Мысли
Как дополнение, цель состоит в том, чтобы перечислить в текстовой консоли структуру дерева. Однако, если у меня есть несколько узлов, которые являются родителями общего подграфа, я хочу перечислить этот подграф только один раз, а затем ссылаться на него с помощью некоторой номенклатуры, такой как «[Subnode1 ...]», везде.
Я имею в виду это для двух целей -
- Я не хочу постоянно выводить одни и те же данные на экран несколько раз
- Мне нужен способ визуально указать, где узел просто ссылается на другую часть существующего графа.
Таким образом, установка / очистка логического элемента при прохождении каждого узла нарушает цель. Я не хочу очищать любые bools до тех пор, пока обход корневого узла не будет завершен (то есть самый последний шаг обхода). И, конечно, к этому моменту возникает вопрос, как мне заставить все эти флаги сбросить себя, не повторно посещая весь график?
В любом случае, я бы предпочел не пересекать график дважды (один раз для выполнения работы и снова для очистки флагов) или постоянно повторять список каждый раз, когда я посещаю узел, чтобы определить, посещал ли я его раньше. График не большой, но он является частью подсистемы рендеринга, и обход происходит между кадрами, поэтому я хочу, чтобы он работал быстро ...