关闭

画二叉树小工具

标签: 数据结构算法工具
2491人阅读 评论(0) 收藏 举报
分类:

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



0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32407次
    • 积分:716
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:1篇
    • 译文:0篇
    • 评论:12条
    文章分类
    最新评论