二叉树可视化--Graphviz
大家平时写C程序有没有种把内存里的数据结构全给画出来的冲动呢?数据量小的话,画起来还蛮简单,用viso,我前面的文章都用viso画的。之前写红黑树代码的时候,用的是命令行把整个树打印出来,不过只是一些小片段,很丑,还得自己手动再在纸上画一遍,非常麻烦,要是用程序就能把图画出来那就爽了。好了,推荐使用 Graphviz这个东东,so 一下就知道啦,功能挺丰富的,也提供了很多库(c,php,python等),下面画一颗简单的红黑树(红黑树代码参考我前面的代码,下面只写画树的代码)直接看效果图:
这树怎么画的呢?参考官网 http://www.graphviz.org/Documentation.php
1.编写规则文件(可以用Graphviz自带的lib,如cgraph等生成,或者直接就用fprintf生成,可以简单看下中文的翻译 简单的dot规则)
2.用Graphviz自带的一些工具例如dot等解析一下规则文件,然后生成图片(ps,jpg,png等)或者其它格式的文件。
下面是实现。
t.c//测试代码,用到的函数参考我前面写的红黑树文章的代码。
void rbtree_fprint_node(rbtree_node * t,FILE *fp){
if(t->color == RB_BLACK){
fprintf(fp,"node[shape=record,style=filled,color=black,fontcolor=white];\n");
}else{
fprintf(fp,"node[shape=record,style=filled,color=red,fontcolor=white];\n");
}
fprintf(fp,"%d[label=\"<f0> | <f1> %d | <f2> \"];\n",t->key.value,t->key.value);
}
void rbtree_fprint_tree(rbtree_node * t,FILE *fp){
if(rb_nil == t) return;
if(t->parent == rb_nil){//root
rbtree_fprint_node(t,fp);
}
if(t->left != rb_nil){
rbtree_fprint_node(t->left,fp);
fprintf(fp,"%d:f0:sw->%d:f1;\n",t->key.value,t->left->key.value);
}
if(t->right != rb_nil){
rbtree_fprint_node(t->right,fp);
fprintf(fp,"%d:f2:se->%d:f1;\n",t->key.value,t->right->key.value);
}
rbtree_fprint_tree(t->left,fp);
rbtree_fprint_tree(t->right,fp);
}
int main(int argc,char *argv[]){
rbtree_node *t,*p,*max,*min;
int arr[] = {9,8,11,18,2,5,16,1,7,999,234,7662,387,928,454};
int i;
rbtree_init_nil();
t = rbtree_create(15);
t->color = RB_BLACK;
for(i=0;i<15;i++){
rbtree_add(&t,arr[i]);
}
//rb tree print
FILE *fp;
fp = fopen("g2.dot","w+");
fprintf(fp,"digraph G{\n");
rbtree_fprint_tree(t,fp);
fprintf(fp,"}");
fclose(fp);
}
最终生成的是 一个 dot文件,dot文件的语法上官网查,并不是很复杂。
digraph G{
node[shape=record,style=filled,color=black,fontcolor=white];
9[label="<f0> | <f1> 9 | <f2> "];
node[shape=record,style=filled,color=black,fontcolor=white];
5[label="<f0> | <f1> 5 | <f2> "];
9:f0:sw->5:f1;
node[shape=record,style=filled,color=red,fontcolor=white];
18[label="<f0> | <f1> 18 | <f2> "];
9:f2:se->18:f1;
node[shape=record,style=filled,color=black,fontcolor=white];
2[label="<f0> | <f1> 2 | <f2> "];
5:f0:sw->2:f1;
node[shape=record,style=filled,color=black,fontcolor=white];
8[label="<f0> | <f1> 8 | <f2> "];
5:f2:se->8:f1;
node[shape=record,style=filled,color=red,fontcolor=white];
1[label="<f0> | <f1> 1 | <f2> "];
2:f0:sw->1:f1;
node[shape=record,style=filled,color=red,fontcolor=white];
7[label="<f0> | <f1> 7 | <f2> "];
8:f0:sw->7:f1;
node[shape=record,style=filled,color=black,fontcolor=white];
15[label="<f0> | <f1> 15 | <f2> "];
18:f0:sw->15:f1;
node[shape=record,style=filled,color=black,fontcolor=white];
999[label="<f0> | <f1> 999 | <f2> "];
18:f2:se->999:f1;
node[shape=record,style=filled,color=black,fontcolor=white];
11[label="<f0> | <f1> 11 | <f2> "];
15:f0:sw->11:f1;
node[shape=record,style=filled,color=black,fontcolor=white];
16[label="<f0> | <f1> 16 | <f2> "];
15:f2:se->16:f1;
node[shape=record,style=filled,color=red,fontcolor=white];
387[label="<f0> | <f1> 387 | <f2> "];
999:f0:sw->387:f1;
node[shape=record,style=filled,color=black,fontcolor=white];
7662[label="<f0> | <f1> 7662 | <f2> "];
999:f2:se->7662:f1;
node[shape=record,style=filled,color=black,fontcolor=white];
234[label="<f0> | <f1> 234 | <f2> "];
387:f0:sw->234:f1;
node[shape=record,style=filled,color=black,fontcolor=white];
928[label="<f0> | <f1> 928 | <f2> "];
387:f2:se->928:f1;
node[shape=record,style=filled,color=red,fontcolor=white];
454[label="<f0> | <f1> 454 | <f2> "];
928:f0:sw->454:f1;
}
二叉树可视化--Graphviz的更多相关文章
- python 绘图与可视化 Graphviz 二叉树 、 error: Microsoft Visual C++ 14.0 is required
需要对二叉树的构建过程进行可视化,发现了这个Graphviz软件,他对描绘数据间的关系十分擅长. 下载链接:https://graphviz.gitlab.io/_pages/Download/Dow ...
- 二叉树的python可视化和常用操作代码
二叉树是一个重要的数据结构, 本文基于"二叉查找树"的python可视化 pybst 包, 做了一些改造, 可以支持更一般的"二叉树"可视化. 关于二叉树和二叉 ...
- 【LeetCode】211. Add and Search Word - Data structure design 添加与搜索单词 - 数据结构设计
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,211,搜索单词,前缀树,字典树 ...
- 【LeetCode】208. Implement Trie (Prefix Tree) 实现 Trie (前缀树)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,Trie, 前缀树,字典树,20 ...
- 1 python使用networkx或者graphviz,pygraphviz可视化RNN(recursive)中的二叉树
代码地址https://github.com/vijayvee/Recursive-neural-networks-TensorFlow 代码实现的是结构递归神经网络(Recursive NN,注意, ...
- 用 Graphviz+pvtrace 可视化函数调用
最近在想怎么把一个程序的函数调用关系快速的用流程图的方式画出来,之后看到了这个一篇文章“用 Graphviz 可视化函数调用”(http://www.ibm.com/developerworks/cn ...
- keras可视化pydot graphviz问题
Keras中提供了一个神经网络可视化的函数plot,并可以将可视化结果保存在本地.plot使用方法如下: from keras.utils.visualize_util import plot plo ...
- 安装doxygen(一个自动文档生成工具)+Graphviz图形可视化软件
参考文章: http://www.fmddlmyy.cn/text21.html http://www.cnblogs.com/duguguiyu/archive/2008/06/29/1231852 ...
- 利用Graphviz 可视化GO 数据库
GO是一个同源蛋白的数据库,按照三大类别BP(生物学过程), MF(分子功能), CC(细胞组分) 对基因的产物-蛋白质进行了分类: 在GO数据库中,本质上是一个有向无环图的数据结构,在三大类别之下, ...
随机推荐
- Newtonsoft.Json.JsonWriter
[一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/4754769.html] JsonWriter使用: 前台 $.post("Ajax ...
- 各种HTTP错误消息含义
错误代码 错误消息 400 无法解析此请求. 401.1 未经授权:访问由于凭据无效被拒绝. 401.2 未经授权: 访问由于服务器配置倾向使用替代身份验证方法而被拒绝. 401.3 未经授权:访问由 ...
- bulkTransfer通讯必须注意的问题:bulk buffer size(16K)
Android USB host与HID使用bulkTransfer通讯接收和发送的数据长度不会超过16384,这个问题困扰了我很长一段时间,终于发现问题所在,不是出在我的程序设计,也不是硬件的发送/ ...
- 132. Palindrome Partitioning II
题目: Given a string s, partition s such that every substring of the partition is a palindrome. Return ...
- BZOJ_1600_[Usaco2008_Oct]_建造栅栏_(动态规划)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1600 将长度为n的线段分成4段,长度为整数,围成面积>0的四边形,求方案数. 分析 首先 ...
- [HDU POJ] 逆序数
HDU 1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...
- 【转】VIRTUALBOX导入已有.VDI文件步骤
原文网址:http://blog.csdn.net/wanghai__/article/details/6703923 1.安装SUN VIRTUALBOX 2.新建,进入到“新建虚拟电话”对话框,下 ...
- lua与C/C++交互
Lua设计小巧很容易与C/C++进行交互,下面我们具体讲解C/C++中如何调用lua,而lua中又如何调用C代码. 首先lua和C交互的一个重要的数据结构lua_State,它是进行数据交换的堆栈,按 ...
- bootstrap-内联表单 水平(横向)表单 响应式图片 辅助类 [转]
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 用java api读取HDFS文件
import java.io.IOException; import java.io.InputStream; import java.security.PrivilegedExceptionActi ...