2010-03-31 11 views
1

이진 트리를 구현하면 첫 번째 유틸리티 중 하나가 트리에 주어진 시각화 함수를 사용하여 화면에 출력하는 시각화 함수가 작성됩니다.C++에서 이진 트리를 시각화하는 방법

스택과 같이 매번 인쇄 할 때 cout 함수를 사용하면 문제가되는 대신 작업 값을 나타낼 수 없습니다.

ASCII로 제대로 인쇄하는 것은 이해하기가 어렵습니다. 한편, 귀하의 나무와 귀하의 작업을 선명하게 보여줄 수는 없습니다.

일부 연구를 통해 Graphviz라는 도구 (그래프라고 부름)와 그래프의 시각화를 자동으로 생성하는 도구 집합을 사용하는 그래프 시각화 소프트웨어라는 도구를 발견했습니다. Graphviz는 나무가 아닌 그래프를 그리는 도구이므로 사용할 수 없습니다. 이를 위해 C++ 코드를 구현하는 것은 매우 어렵습니다.

내 트리를 표시하는 코드, 알고리즘 또는 방법을 찾고 있습니다. Visual Studio C++로 작업하기 때문에 GTK, QT, STL 또는 WPF와 같은 라이브러리를 사용하려고합니다.

사용할 수 있습니까? 어느 것이 가장 적합합니까?

+0

는 http://stackoverflow.com/questions/에서보세요 801740/c-how-to-a-binary-tree-to-the-console –

+0

@Neil : 허용 된 응답의 링크 된 사이트가 죽은 것처럼 보입니다. –

+0

정적 이미지/문서 또는 동적 인 것을 원하십니까? –

답변

3

나무도 그래프입니다. 당신은 Graphviz를 사용할 수 있습니다. 그리고 DOT 형식은 very simple 출력입니다. 예를 들어 trees을 포함하여 Graphviz gallery을 참조하십시오.

+0

어떻게, 당신은 toturial에 대한 링크를 가지고! 전에 사용했거나! –

+0

가장 간단한 방법은 그래프를 DOT 형식으로 인쇄하는 것입니다 (Graphviz 갤러리 참조, 이미지를 클릭하여 각 샘플 그래프의 DOT를 볼 수 있음). DOT를 직접 Graphviz에 파이프하거나 디스크의 임시 파일에 쓸 수 있습니다. 그런 다음 Graphviz를 호출하여 이미지를 디스크에있는 파일로 만들거나 소프트웨어로 다시 파이프하여 파일을 메모리로 읽어 화면에 표시 할 수 있습니다. – Arkku

1

아주 간단한 해결책 인쇄 나무 :

5 
    1 
    5 
    9 
    7 
    14 

코드 (Node::print() 기능이 중요한 것입니다) :

#include<iostream> 

using namespace std; 

class Tree; 

class Node{ 
public: 
    Node(int val): _val(val){} 
    int val(){ return _val; } 
    void add(Node *temp) 
    { 
     if (temp->val() > _val) 
     { 
      if (_rchild) 
       _rchild->add(temp); 
      else 
      { 
       _rchild = temp; 
      } 
     } 
     else 
     { 
      if (_lchild) 
       _lchild->add(temp); 
      else 
      { 
       _lchild = temp; 
      } 
     } 
    } 
    void print() 
    { 
     for (int ix = 0; ix < _level; ++ix) cout << ' '; 
     cout << _val << endl; 
     ++_level; 
     if (_lchild) 
     { 
      _lchild->print(); 
      --_level; 
     } 
     if (_rchild) 
     { 
      _rchild->print(); 
      --_level; 
     } 
    } 
private: 
    int _val; 
    Node *_lchild;  
    Node *_rchild; 
    static int _level;  
}; 

int Node::_level = 0;  

class Tree{ 
public: 
    Tree(): _root(0){} 
    void add(int val) 
    { 
     Node *temp = new Node(val); 
     if (!_root) 
      _root = temp; 
     else 
      _root->add(temp);  
    } 
    void print() 
    { 
     if (!_root) 
      return; 
     _root->print();    
    } 
private: 
    Node *_root;  
}; 

int main() 
{ 
    Tree tree; 
    tree.add(5); 
    tree.add(9); 
    tree.add(1); 
    tree.add(7); 
    tree.add(5); 
    tree.add(14); 
    tree.print(); 
} 
관련 문제