2014-07-05 2 views
1

주어진 트리 (트리별로, N 노드, N-1 에지를 의미하며 연결됨)는 트리의 루트가 이되도록 변경됩니다. 이제 다른 노드에서 이라고하면 이라는 하위 트리에있는 모든 노드의 합계를 찾아야합니다. 나는 그것을 C++로 구현하려했다. 나는 벡터지도 [t]를 반복하는 경우트리의 루트가 변경되면 어떻게 될까요?

std::map<int, std::vector< pair<int,int> > > map; 

, 나는 그것이 R로 연결되는 경로로 이동하지 않도록해야합니다. 어떻게 그걸 보장할까요? 또한 트리의 루트가 변경 될 수있는 조건을 고려하여 C++에서 트리를 저장하는 더 좋은 방법이 있습니까? 나는지도가 뿌리에 관해 무엇인가 전하지 않기 때문에있을 것이라고 생각합니다. :)

답변

3

문제는 트리를 일반 그래프로 저장했기 때문입니다. 따라서 주어진 꼭지점에 대해 루트 (즉, 부모)쪽으로 향하는 호가 무엇인지 알 수 없습니다.

해결 방법은 상황에 따라 크게 달라집니다. 간단한 해결책은 r에서 시작하여 t를 찾는 깊이 우선 검색입니다. t를 발견하자마자 t의 부모를 찾았으므로 t부터 시작하여 서브 트리를 쉽게 식별 할 수 있습니다.

또는 t에서 시작하여 r을 찾을 수 있습니다. r을 발견하면 t의 부모를 찾았고 다른 모든 호를 가로 지르며 t의 하위 트리를 찾을 수 있습니다. 그래프의 다른 표현에 대해

는, 보통은 정점의 목록을 유지하는 것이 좋습니다 각각의 정점에서와 같이 이웃 정점의 목록을 유지 :

std::map<int, std::list<int> > 
관련 문제