画二叉树小工具

原创 2013年12月06日 14:13:30

学习树的时候,经常需要在纸上画出逻辑存储结构。不仅不环保, 还麻烦。写了一个画二叉树的小工具dtree(drawtree)。源代码参考下面链接。

先上个图





该工具是基于终端字符图形库ncurses实现的, 其实如果完全不用第三方库, 也能实现, 只不过有些限制和麻烦。

一般linux发行版都有ncurses(或者curses)库, dtree工具用ncurses库方便移动光标。 如果不用ncurses库的话, 需要额外的数据结构记录每个坐标位置当前显的个字符。

还有ncurses库提供了COLS宏智能的显示当前终端的宽度,如果自己获取终端宽度可能比较麻烦。

记录一下实现这个工具的思路:

认识2个结构:

struct Node  一般树的存储节点, 含有 左孩子域, 右孩子域和数据域。

struct DNode  在Node结构上增加了index域, 代表 对应满二叉树中的位置索引。


config.h文件定义一些常量。

MAX_NODE  可以画的最多DNode节点数目。

LEAF_MARGIN 树最底一层中, 相邻连个DNode之间的距离。


自定义名词:

递减因子: 每个节点与兄弟节点之间的距离除以自己孩子节点之间的距离。


实现基本思路是这样的:

先将Node结构转成DNode结构。找出每层第一个节点与index的关系式, 以每层第一个节点做为该层所有节点的参考, 计算自己的坐标,根据数学推算, 可以算出每个节点坐标和index的关系式。递减因子取2, 画出所有节点。

缺陷:

1. 节点之间画的比较稀疏, 如果树平衡性比较差, 画的数目更小。 解决办法, 每层之间的递减因子 调节小一点, 小于2, 尝试把树旋转成平衡树。

2. 坐标移动依赖ncurses库, 解决办法: 可以完全基于空格( '   ')和换行('\n')来移动坐标, 但是需要数组存储每个位置的字符, 并且, 显示区域的宽度不能动态适应。


源代码下载链接

http://download.csdn.net/detail/karizhang/6668639



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二叉树可视化--Graphviz

二叉树可视化--Graphviz

使用Graphviz 画二叉树

1.安装graphviz sudo apt-get install graphviz 2.编写.dot文件 vi test.dot digraph abc{ a; b; ...

在线编程--层次打印二叉树

题目信息: 有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。 给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素...

Java Mail小工具 - MailUtils

使用Java mail发送电子邮件,我们需要导入两个依赖jar包: mail.jar activation.jar 下载地址:http://download.csdn.net/detail/itso...

二叉树源代码

基于C写的平衡二叉树

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)