二叉树的可视化
来源:互联网 发布:在国外怎么连国内网络 编辑:程序博客网 时间:2024/05/22 06:43
在我前面的一篇博文数据结构之红黑树中,提到了数据结构之可视化的重要性。 因为如果我们能将二叉树可视化,也能提高加快调试,减少bug。原文给出了print_tree函数,会打印二叉树,但是旋转了90度,不优美,不友好。最近学习了下Graphviz这个软件,学了下怎么用这个软件绘制图片,基本解决了二叉树的可视化问题。
我还是以我的红黑树代码为例子,写测试代码,看下如何将我们插入产生的红黑树可视化。
我们看下代码:
typedef unsigned long long ULL;void __tree2dot(struct rbtree_node* node,FILE* stream){ if(node->color == RB_BLACK) { fprintf(stream,"%llu [shape=box];n",*(ULL*)(node->key)); } if(node->left) { fprintf(stream," %llu -> %llu;n",*(ULL*)(node->key),*(ULL*)(node->left->key)); __tree2dot(node->left,stream); } if(node->right) { fprintf(stream," %llu -> %llu;n",*(ULL*)(node->key),*(ULL*)(node->right->key)); __tree2dot(node->right,stream); }}int tree2dot(struct rbtree* tree,char* filename){ assert(tree != NULL && filename != NULL); FILE* stream = fopen(filename,"w+"); if(stream == NULL) { fprintf(stderr, "open failed n"); return -1; } fprintf(stream,"digraph {n"); __tree2dot(tree->root,stream); fprintf(stream,"}n"); fclose(stream); return 0; }
tree2dot接受一个二叉树和一个文件名作为入参。负责创建文件 关闭文件和填写dot文件有向图的格式头和尾。
__tree2dot是递归调用,添加父节点到子节点的有向连接。我们因为是红黑树,所以添加了这部分处理红黑结点的代码:
if(node->color == RB_BLACK) { fprintf(stream,"%llu [shape=box];n",*(ULL*)(node->key)); }这部分代码的作用对于黑节点,采用box类型表示节点,对于红节点,采用默认的椭圆图形。
比较才能看到进步,我们比较下新旧两种方法的输出:
在看下生成的dot文件(Ubuntu下用XDot打开)
下面这种的优越性,一目了然。这个方法目前有个缺点是没有将NULL节点处理,导致421看不出是386左孩子还是右孩子,我们改进下:
void process_null_node(struct rbtree_node* node, int nullcount, FILE* stream){ fprintf(stream, " null%d [shape=hexagon];n", nullcount); fprintf(stream, " %llu -> null%d;n",*(ULL*)(node->key), nullcount);}void __tree2dot(struct rbtree_node* node,FILE* stream){ static int null_node_cnt = 0; if(node->color == RB_BLACK) { fprintf(stream,"%llu [shape=box];n",*(ULL*)(node->key)); } if(node->left) { fprintf(stream," %llu -> %llu;n",*(ULL*)(node->key),*(ULL*)(node->left->key)); __tree2dot(node->left,stream); } else { process_null_node(node,null_node_cnt++,stream); } if(node->right) { fprintf(stream," %llu -> %llu;n",*(ULL*)(node->key),*(ULL*)(node->right->key)); __tree2dot(node->right,stream); } else { process_null_node(node,null_node_cnt++,stream); }}我们将NULL节点处理成六边形,这样就能完整的看出红黑树的情况了,请看生成的dot文件:
完整的代码在我的github上 ,可以去下面路径去取:
https://github.com/manuscola/rbtree
参考文献:
1 Drawing graphs with dot
- 二叉树的可视化
- 二叉树的可视化
- 二叉树的可视化
- 二叉树的可视化
- java 实现二叉树的可视化
- 二叉树可视化--Graphviz
- 可视化遍历二叉树
- 二叉树可视化--Graphviz
- 半可视化打印二叉树
- 算法,请不要这么经典 - 二叉树的可视化
- Flex布局+JS:实现可视化的二叉树遍历
- python建立二叉树并且可视化
- 二叉树可视化创建(二叉树正输出)
- 二叉查找树C语言实现及其可视化
- 前端fabric.js实现二叉树可视化布局
- tensorboard的可视化及模型可视化
- 二叉树的各种遍历,二叉树改链表,二叉树复习
- 二叉树的宽度(二叉树)
- Spring注解入门
- 用java实现将一个项目中所有的.java文件合并输出至某文件
- 项目管理的20条锦囊妙计
- Oracle用户、权限、角色管理
- 德尔菲法 Delphi 专家判断
- 二叉树的可视化
- ubuntu更新时"Not enough free disk space"
- n级台阶 1,2,3 步走法
- PMP考试应试技巧
- Iterator List类去数值
- 把图片集合成一段avi视频
- 青蛙跳台阶问题
- 线性表之单链表(链式存储结构)--C实现
- PMP常见疑难知识点