2010-03-31 17 views
1

Lorsque j'ai implémenté des arbres binaires, l'un des premiers utilitaires que j'écris est une fonction de visualisation qui donne un arbre à l'écran. Utiliser la fonction cout pour l'imprimer à chaque fois comme une pile est un problème pour moi, je ne peux pas représenter la valeur de mon travail.Comment visualiser un arbre binaire en C++

L'impression correcte des arbres en ASCII est assez difficile à comprendre. Pendant ce temps, il ne peut pas représenter votre arbre et vos opérations en vue claire. Avec quelques recherches, j'ai trouvé un outil appelé Graphviz - Logiciel de Visualisation Graphique - qui utilise un langage (appelé DOT) et un ensemble d'outils pour générer automatiquement des visualisations de graphiques. Graphviz est un outil pour dessiner des graphiques, pas des arbres, donc je ne peux pas l'utiliser; et l'implémentation du code C++ pour cela est très difficile.

Je cherche un code, un algorithme ou une méthode pour montrer mon arbre. Je pense à utiliser des bibliothèques comme GTK, QT, STL ou WPF, parce que je travaille avec Visual Studio C++.

Est-il possible de les utiliser? Lequel convient le mieux?

+0

Jetez un oeil à http://stackoverflow.com/questions/ 801740/c-comment-dessiner-un-arbre-binaire-à-la-console –

+0

@Neil: Le site lié dans la réponse acceptée semble mort. –

+0

voulez-vous une image statique/document ou quelque chose de dynamique? –

Répondre

3

Un arbre est aussi un graphique; vous pouvez utiliser Graphviz très bien. Et le format DOT est very simple à la sortie. Voir le Graphviz gallery pour des exemples, y compris trees.

+0

Comment, avez-vous un lien pour toturial! vous l'avez utilisé avant ou! –

+0

Le plus simple est d'imprimer votre graphique au format DOT (voir la galerie Graphviz, vous pouvez voir le DOT pour chacun des exemples de graphiques en cliquant sur l'image). Vous pouvez diriger le DOT directement vers Graphviz ou l'écrire dans un fichier temporaire sur le disque. Ensuite, vous pouvez appeler Graphviz pour produire une image, soit sous la forme d'un fichier sur le disque, soit encore en l'introduisant dans votre logiciel qui pourrait le lire en mémoire et l'afficher à l'écran. – Arkku

1

Un très simple arbre d'impression de solution dans le sens horizontal:

5 
    1 
    5 
    9 
    7 
    14 

code (fonction Node::print() est ce qui importe):

#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(); 
}