2011-12-03 8 views
5

트리 데이터 구조 시각화를위한 알고리즘이 있습니까? 나는 인터넷 검색을 시도했지만 couldnt는 무엇이라도 발견한다. 나는이 간단한 작업이 아닌 어떤 알고리즘이 있어야한다고 확신한다. 또는 누군가는 약간 아이디어가 있는가?트리 시각화 알고리즘

+3

Graphviz와 같은 것을 찾고 계십니까? http://www.graphviz.org/ –

+1

알고리즘 또는 알고리즘을 표시하는 서비스를 찾으십니까? – Duniyadnd

+0

내 프로젝트에서 트리를 시각화해야하므로 알고리즘이 필요합니다. – MrProper

답변

7

가정 : 각 노드가 자식 노드 위에 가운데에 표시되도록하려고합니다.

이를 달성하려면 각 노드의 너비를 계산하십시오.이 노드의 크기는 왼쪽 또는 오른쪽 형제 하위 트리와 겹치지 않도록이 노드의 전체 하위 트리를 표시하는 데 필요한 가로 공간의 양으로 정의됩니다.

width = 1 + sum(widths of children's nodes) 

그래서, 각 노드의 폭을 계산하기 위해 트리를 깊이 우선 탐색을 수행

이에 연결됩니다. 표시하려면 너비 우선 트리 탐색을 수행하여 레벨별로 트리를 그립니다.

이것은 어떻게 움직이는가에 대한 대략적인 아이디어입니다. 트리를 렌더링하는 방법에 대한 세부 사항에 따라 너비 계산을 조정할 수 있습니다.

1

예를 들어 graphviz에서 DOT 언어를 사용할 수 있습니다.

3

Tree-mapping 아마도 당신이 찾고있는 것입니다. Graphviz는 트리 구조에 특화되지 않은 그래프 구조를 시각화하는 데 유용합니다. 나는 그것을 다시 발견 할 수는 없지만 treemaps (voronoi라고 생각한다)가 트리 구조를 표현하는데 최적이라고 과학 논문에서 읽었던 것을 기억한다. 트리 구조는 그들이 소비하는 장소와 그 영역이 어떤 단위를 나타 내기 위해 사용될 수 있다는 점을 고려한다. 예).

Here 일부 대안입니다.

Here은 주제에 대한 유용한 정보 및 기타 정보 목록입니다.

0

트리를 왼쪽에서 오른쪽으로 인쇄 할 수도 있습니다. 즉, 가장 왼쪽에 루트를, 그 바로 오른쪽으로 첫 번째 레벨을 인쇄 할 수 있습니다. 각 레벨이 인쇄 된 트리가 자체 '열'이라는 것을 알 수 있습니다. 알고리즘은 다음과 같습니다.

print(node, spaces): 
    if node has left child: 
     print(left_child, spaces + ' ') 
    print spaces + node + '\n' 
    if node has right child: 
     print(right_child, spaces + ' ') 

이 알고리즘은 한 줄에 하나의 트리 노드를 인쇄합니다. 트리의 각 레벨은 일부 공백으로 오른쪽으로 들여 쓰기됩니다. 이 알고리즘은 항목을 오름차순으로 인쇄하지만 내림차순은 오른쪽 자식을 먼저 처리하여 얻을 수 있습니다.