如何在C ++中可视化二叉树

时间:2010-03-31 13:04:15

标签: c++ visual-studio algorithm data-structures graphviz

当我实现了二叉树时,首先编写的实用程序之一就是一个可视化函数,它将树打印到屏幕上。

使用cout函数每次像堆栈一样打印它对我来说是一个问题,我不能代表我的工作价值。

使用ASCII正确打印树很难理解。同时,它无法以清晰的视角表示您的树和您的操作。

通过一些研究,我发现了一个名为Graphviz的工具 - 图形可视化软件 - 它使用一种语言(称为DOT)和一组自动生成图形可视化的工具。 Graphviz是绘制图形而不是树木的工具,因此我无法使用它;为此实现C ++代码非常困难。

我正在搜索一些代码,算法或方法来显示我的树。我正在考虑使用像GTK,QT,STL或WPF这样的库,因为我正在使用Visual Studio C ++。

可以使用它们吗?哪个最适合?

5 个答案:

答案 0 :(得分:3)

树也是图表;你可以使用Graphviz就好了。输出的DOT格式为very simple。有关示例,请参阅Graphviz gallery,其中包括trees

答案 1 :(得分: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();
}

答案 2 :(得分:0)

您还可以生成乳胶代码并编译tex文件以获取pdf / eps。检查一下:http://hstuart.dk/2007/02/21/drawing-trees-in-latex/

答案 3 :(得分:0)

为了简化格式,我使用了yEd Graph EditorTrivial Graph Format的组合。

答案 4 :(得分:0)

检查此算法here
为任何二叉树打印ASCII可视化。

                     0X0                     
                     / \                     
                    /   \                    
                   /     \                   
                  /       \                  
                 /         \                 
                /           \                
               /             \               
              /               \              
             /                 \             
            /                   \            
           /                     \           
         0X0                     0X0         
         / \                     / \         
        /   \                   /   \        
       /     \                 /     \       
      /       \               /       \      
     /         \             /         \     
   0X0         0X0         0X0         0X0   
   / \         / \         / \         / \   
  /   \       /   \       /   \       /   \  
0X0   0X0   0X0   0X0   0X0   0X0   0X0   0X0