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