-1

二分木を実装したとき、最初に書くユーティリティの 1 つは、与えられた木を画面に出力する視覚化関数です。

スタックのように毎回 cout 関数を使用して印刷するのは私にとって問題であり、自分の仕事の価値を表すことができません。

ツリーを ASCII で適切に表示するのは、非常に理解しにくいものです。一方、ツリーと操作を明確に表すことはできません。

いくつかの調査で、グラフの視覚化を自動的に生成するための言語 (DOT と呼ばれる) と一連のツールを使用する Graphviz (グラフ視覚化ソフトウェア) という名前のツールを見つけました。Graphviz はツリーではなくグラフを描画するためのツールであるため、使用できません。このための C++ コードの実装は非常に困難です。

ツリーを表示するためのコード、アルゴリズム、またはメソッドを探しています。Visual Studio C++ を使用しているため、GTK、QT、STL、WPF などのライブラリを使用することを考えています。

それらを使用することは可能ですか?どれが最適ですか?

4

6 に答える 6

4

ツリーはグラフでもあります。Graphviz を問題なく使用できます。また、DOT 形式は出力が非常に簡単です。treesなどの例については、 Graphviz ギャラリーを参照してください。

于 2010-03-31T13:07:23.320 に答える
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();
}
于 2013-09-07T04:48:00.663 に答える
0

ラテックスコードを生成し、texファイルをコンパイルしてpdf/epsを取得することもできます。これを確認してください:http://hstuart.dk/2007/02/21/drawing-trees-in-latex/

于 2012-02-27T21:44:59.873 に答える
0

フォーマットを単純にするために、yEd Graph EditorTrivial Graph Formatを組み合わせて使用​​しています。

于 2012-02-27T21:53:15.177 に答える