二叉树的可视化

来源:互联网 发布:淘宝天猫优惠券网站 编辑:程序博客网 时间:2024/05/19 14:51

经常我们创建一个树的时候,我们都希望能直观的看到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命令,如果安装成功,会有以下信息输出
这里写图片描述

关于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后面的格式,就是你系统所支持的格式

这里写图片描述

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

这里写图片描述

图一

这里写图片描述

图二

0 0