2010-08-12 5 views
0

이 질문은 우수 사례에 관한 것입니다. 저는 3 차원 간격의 Kd-Tree를 구현하고 있습니다. 트리의 재귀 구조로 인해 고유 한 클래스를 만들려고 유혹 될 것이므로 KdTree 노드와 잎을 나타냅니다.트리 구조에서 트리, 노드, 리프의 이름을 지정하는 방법은 무엇입니까?

그러나 요소는 잎에만 포함되어 있으며 일부 일반 트리 매개 변수 (예 : 공백을 분할하기 전 최대 요소 수)는 모든 트리에서 동일해야하며 마지막으로 분할하는 평면은 전혀 의미가 없습니다. 이파리. 나는 세 가지 클래스 (KdTree, KdNode, KdLeaf)를 구성하는 각 노드 또는 잎 (사실, 정확히 어떤 경우인지,) 사실 Kd를 트리에 척 단지 및 데이터를 복제해야했다

?

마소

답변

1

나는 Tree 클래스가 필요 없다고 말할 것입니다. 상단 요소는 나머지 모든 노드와 같습니다.

는 잎과 가지 노드를 구분하기 위해,이 대단히 의사 것을

namespace KdTree 
{ 
     abstract class Node 
     { 
      virtual EnumLeafNodes(LeafNodeCallback callback); 
      virtual GetLeafCount(); 

     } 

     class Leaf : Node 
     { 
      // implement virtuals by returning/counting leaf values 
     } 

     class Branch : Node 
     { 
      // implement virtuals by delegating to child nodes 

      // direct children: 
      Node[] children; 
     } 
} 

참고 가고 싶어 (C 번호는 -ish). 이 설계의 기본 개념은 가상 함수를 사용하여 분기와 리프 노드 간의 동작을 구분하고 분기가 해당 자식 노드에 위임 할 수 있다는 것입니다. 이것은 Visitor 패턴으로 알려진 것에 대한 간단한 예입니다.

1

만들고 개인 KdTree의 컨텍스트 내에서 클래스 KdNode 및 KdLeaf를 사용합니다. 이것은 당신의 삶을 더 편하게 만들고, 프로그램의 다른 부분으로부터 복잡성을 숨길 것입니다.

+0

세 가지 클래스를 사용하면 데이터 구조의 일부를 더 쉽게 이해할 수 있습니다. – Mark

1

리드와 트리가 단순히 "지점"의 끝 부분에있는 노드 인 것 같습니다.

이 경우 노드 이름을 지정하고이를 구문 분석 할 때 KdParentNode, KdNode 및 KdChildNode로 참조합니다. 노드에 부모가 없으면 트리 (루트) 노드이고 자식 노드가없는 경우에는 리프 노드입니다.

관련 문제