二叉树的可视化

经常我们创建一个树的时候,我们都希望能直观的看到tree的样子,以确认tree是否正确,要么手画,要么电脑自动生成。

那么下面我们就看看如何自动生成一个tree。

这里我们要用到一个开源的软件Graphviz ,官网http://www.graphviz.org/
安装方法有两种:
1. 如果是ubuntu系统,可以直接敲入以下命令
sudo apt-get install graphviz
2. 直接下载源码包安装
A. 源码包下载地址
http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.38.0.tar.gz
B. 解压源码包
tar zxvf graphviz-2.38.0.tar.gz
C. 执行./configure
D. make
E. make install

安装完成后,直接敲dot -v命令,如果安装成功,会有以下信息输出
二叉树的可视化_第1张图片

关于graphviz的一些用法,可以参考官网的使用说明
http://www.graphviz.org/Documentation.php
或者可以参考下面这个例子
程序员的绘图利器 — Graphviz

有了上面的基础知识后,那么接下来我们看看,如何用graphviz来画一棵二叉树。

原理很简单,就是将二叉树的节点通过写文件的方式,按照graphviz的DOT格式,写到一个文件里面,然后再用dot命令,将生成的dot文件,转换成你想要的格式。
具体看代码实现

关于二叉树的创建方法,请参考下面的这篇文章
二叉树的创建与遍历

tree_visual_create.h

#ifndef __TREE_VISUAL_CREATE_H__
#define __TREE_VISUAL_CREATE_H__

extern void tree_visual_create(BI_TREE * tree, char * fileName);

#endif

tree_visual_create.c

#include <stdio.h>
#include <stdlib.h>
#include "binary_tree.h"
#include "tree_visual_create.h"


void tree_create_dot(BI_TREE * node, FILE* stream)
{
    if(node->lChild)
    {        
        fprintf(stream,"  %c -> %c;\n", (node->value), (node->lChild->value));
        if(NULL == node->rChild)
        {
            fprintf(stream,"  %c -> null%c[weight=100, style=invis]; null%c[style=invis];\n", (node->value), (node->value), (node->value));
        }
        tree_create_dot(node->lChild, stream);
    }

    if(node->rChild)
    {
        if(NULL == node->lChild)
        {
            fprintf(stream,"  %c -> null%c[weight=100, style=invis]; null%c[style=invis];\n", (node->value), (node->value), (node->value));
        }
        fprintf(stream,"  %c -> %c;\n", (node->value), (node->rChild->value));
        tree_create_dot(node->rChild, stream);
    }
}

void tree_visual_create(BI_TREE * tree, char * fileName)
{
    FILE * stream = fopen(fileName,"w+");
    if(stream == NULL)
    {
        fprintf(stderr, "open failed n");
        return;
    }

    fprintf(stream,"digraph {\n");    
    fprintf(stream,"  node[width=0.5,height=0.5];\n");
    fprintf(stream,"  edge[color=blue, arrowhead=normal];\n");
    fprintf(stream,"  nodesep=0.5;\n\n");

    tree_create_dot(tree, stream);

    fprintf(stream,"}\n");
    fclose(stream);

    return;    
}

上面的tree_visual_create函数里的
tree参数:要转换的二叉树
fileName参数:生成文件的名字

调用方法可以参考下面的代码

void binary_tree_main_test(void)
{
    BI_TREE  *tree = binary_tree_create();

    tree_visual_create(tree, "tree.dot");

    binary_tree_destroy(tree);
}

调用完成之后,就会生成一个xxx.dot(这个上面你调用函数tree_visual_create,传递进入的文件名fileName)文件,然后转换命令如下

dot -Tsvg xxx.dot -o tree.svg

我这里转换的是svg格式(该格式在window下可以用浏览器打开,如果是ubuntu下,可以直接打开),因为我装完Graphviz之后,可能是系统某些lib的问题,导致一些格式不支持,如果你想确认你装的Graphviz支持哪些格式,可以敲入下面的命令

dot -T?

敲完之后,会有下面的结果,Use one of后面的格式,就是你系统所支持的格式

这里写图片描述

下面附上两张生成二叉树的截图

二叉树的可视化_第2张图片

图一

二叉树的可视化_第3张图片

图二

你可能感兴趣的:(数据结构)