画二叉树小工具

来源:互联网 发布:总题库软件 编辑:程序博客网 时间:2024/06/06 00:52

学习树的时候,经常需要在纸上画出逻辑存储结构。不仅不环保, 还麻烦。写了一个画二叉树的小工具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