전달되는 동안 트리 데이터 구조에 대해 많은 질문을했지만 C++에서 올바른 방식으로 처리하지 않은 것처럼 보입니다.트리 데이터 구조 만들기 - 다른 접근법
데이터 구조를 작성하는 방식으로 "끝"또는 "시작"반복기를 갖는 방법에 대해 단일 방식을 생각할 수 없습니다. 이와 같이 모든 기능을 멤버 메서드로 포함하는 방식으로 넘어갔습니다. 대신 이터레이터 & 알고리즘의 표준 접근 방식을 사용합니다.
내 트리 구조의 목표는 다음과 같습니다. 가능한 한 빨리 1 트리에서 다른 트리로 분기를 이동하는 것입니다. 2) 각 가지는 나무가되어야합니다. 또한 트리에서 작업하는 작업은 지점에서 실행될 수 있어야합니다.
내가 한 것은 단순히 벡터가 포함 된 클래스를 만드는 것입니다. - 벡터 내부에는이 클래스의 다른 객체가 있습니다. 예 (난 단지 내가 지금 직면하고있는 가장 큰 문제로, 여기에 최소한의 예를 게시하고있어 클래스가 처리 할 단순히 너무 큰 것입니다) :이 함께 볼 수 있듯이
template <typename ValTy>
class Tree {
private:
std::vector<std::unique_ptr<Tree> > subtrees;
ValTy value;
};
난 그냥 무언가를 취할 수 있습니다 subtrees
- 트리로 사용하거나 주위에 복사하십시오. 그러나 최상위 트리에는 몇 개의 하위 트리 (또는 몇 개의 레벨)가 있는지에 대한 정보가 없으므로 "끝 반복자"를 지정하는 것은 불가능합니다. 그리고 std :: find() 같은 알고리즘은 전체 트리 (그리고 모든 서브 트리)를 반복하지 않습니다.
쉬운 "분기"구조를 유지하면서 가능한 이러한 알고리즘을 사용할 수 있습니까?
잠깐, 내가 이것을 올바르게 이해한다면, 최상위 레벨은 트리의 각 노드에 대한 엔트리를 가지고 있습니까? 트리의 각 노드는 하위 트리 벡터를 포함하는 새로운 레벨이므로 최상위 레벨은 각 노드에 대해 새로운 하위 트리 - 반복자 쌍이 필요합니다. 나는이 "작품"그러나 그것은 매우 비효율적이지 않은 것 같아요? - 지점을 옮기는 (다시) 최상위 레벨을 향해 반복하고 수정해야합니까? – paul23
@ paul23 : 아니요, * iterator *는 트리의 각 레벨에 대해 스택에 요소가 있습니다. 트리를 반복하기 위해 O (log n) 공간이 필요하지만 트리에 부모 포인터가 없으면 피할 수 없습니다. – thiton