【问题标题】:How to visualize a binary tree in C++ [closed]如何在 C++ 中可视化二叉树 [关闭]
【发布时间】:2010-03-31 13:04:15
【问题描述】:

当我实现二叉树时,人们编写的第一个实用程序之一是可视化函数,它给定一棵树,将其打印到屏幕上。

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

用 ASCII 正确打印树很难理解。同时,它无法清晰地呈现您的树和您的操作。

通过一些研究,我发现了一个名为 Graphviz 的工具——图形可视化软件——它使用一种语言(称为 DOT)和一组工具来自动生成图形的可视化。 Graphviz是画图的工具,不是树,所以不能用;并且为此实现 C++ 代码非常困难。

我正在寻找一些代码、算法或方法来显示我的树。我正在考虑使用一些库,如 GTK、QT、STL 或 WPF,因为我正在使用 Visual Studio C++。

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

【问题讨论】:

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


【解决方案1】:

树也是图;你可以很好地使用 Graphviz。 DOT 格式为very simple 输出。有关示例,请参见 Graphviz gallery,包括 trees

【讨论】:

  • 怎么样,有教程链接吗!你以前用过还是!
  • 最简单的方法是以 DOT 格式打印图表(请参阅 Graphviz 库;您可以通过单击图像查看每个示例图表的 DOT)。您可以将 DOT 直接通过管道传输到 Graphviz 或将其写入磁盘上的临时文件中。然后,您可以调用 Graphviz 来生成图像,可以作为磁盘上的文件,也可以再次通过管道将其传输到您的软件中,该软件可以将其读入内存并显示在屏幕上。
【解决方案2】:

一个非常简单的水平方向打印树的解决方案:

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

【讨论】:

    【解决方案3】:

    你也可以生成latex代码,编译tex文件得到pdf/eps。检查这个:http://hstuart.dk/2007/02/21/drawing-trees-in-latex/

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          首先, 对于树的可视化,如果你知道如何使用 C/C++ 将点文件脚本填充到空文件中,Graphviz 实现起来并不难。

          其次,Graphviz 的 dot 不仅可以用来表示图,还可以用来表示树(因为图和树除了叶节点的循环性和互连外,没有太大区别)。

          所以,如果你不方便使用 DOT,Graphviz 还提供了其他工具,如neato、fdp、sfdp、twopi、circo。选择一个最适合您的目的。探索更多 Graphviz here。看看这个image,了解数据方向在不同布局中是如何发生的。

          另一种方式只是简单的在命令行中对树进行编码,比较随意。

          【讨论】:

            猜你喜欢
            • 2012-05-08
            • 1970-01-01
            • 2021-09-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-25
            • 2019-06-09
            相关资源
            最近更新 更多