일반적인 방문자 패턴을 사용하여 가로 지르는 그래프가 있습니다. 방문중인 노드가 현재 탐색 중에 이미 방문되었는지 여부를 알아야하는 문제가 발생했습니다.그래프 방문자의 방문한 노드 추적하기
필자는 생각하는 해결책을 개발했지만 그래프 통과 중에/후에 노드 "플래그"를 만들고 파괴해야합니다.
즉, 각 노드가 방문 될 때 노드의 플래그 객체 포인터 멤버가 검사됩니다. NULL 인 경우 방문자는 플래그 객체를 만들어 노드의 플래그 객체 포인터에 할당합니다. 그런 다음 방문객은 플래그 포인터 멤버에 대한 참조를 자신의 내부 목록 (물론 플래그 객체 포인터에 대한 포인터)으로 푸시합니다. 그렇지 않으면 노드의 플래그 객체 포인터가 NULL이 아닌 경우 방문자는 해당 노드에서의 탐색을 중지합니다.
순회는 순회가 완료된 후 방문자 목록에서 플래그 개체를 터벅 터벅으로 삭제하고 목록의 각 노드 플래그 포인터를 NULL로 다시 할당하는 문제입니다.
그것은 ...
생각을 조금 관여 그리고 누수가 발생하기 쉬운 잠재적 인 인상을 받았는데,하지만 난 더 나은 생각을했습니다?
부록으로, 목적은 텍스트 콘솔에서 트리의 구조를 나열하는 것입니다. 그러나 공통 서브 그래프의 부모 인 노드가 여러 개인 경우 해당 서브 그래프를 한 번만 나열한 다음 "[Subnode1 ...]"과 같은 일부 명명법을 사용하여 참조하십시오.
나는 두 가지 목적이 의미 -
-
내가 지속적으로 화면에 동일한 데이터를 덤프하지 않으
- 여러 번 노드가 단순히 서로를 참조하고 어디 시각적 방법을 원하는 가 표시 기존 그래프의 일부.
이와 같이, 각 노드로서 bool을 설정/해제하는 것은 목적을 무효로합니다. 루트 노드 탐색이 완료 될 때까지 (즉, 탐색의 마지막 단계) bool을 지우고 싶지 않습니다. 그리고 물론, 그 시점까지, 전체 그래프를 다시 방문하지 않고도 플래그를 모두 다시 설정하려면 어떻게해야합니까?
어쨌든 그래프를 두 번 트래버스하지 않고 (작업을 수행하고 플래그를 지우려면 다시 한번) 노드를 방문 할 때마다 반복적으로 목록을 반복하여 이전에 방문했는지 확인합니다. 그래프는 크기가 크지 않지만 렌더링 서브 시스템의 일부이며 프레임 사이에서 순회가 발생하므로 빠르게 실행되는지 확인하십시오.
방문자 패턴의 전체적인 점은 ** 그렇게하지 않아도됩니다 **. 방문자를 어떻게 구현했는지에 대해 더 자세히 설명해 줄 수 있습니까? –
그건, 코드는 천 단어의 가치가있다 ... –
죄송합니다. 내가 더 자세히 말했을 때, 나는 코드를 의미했다. –