画二叉树小工具

原创 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 画二叉树

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

使用graphviz绘制二叉树

Graphviz是开源免费跨平台图形绘制工具,使用其提供的dot语法,可以很方便的用来绘制“图”结构(这里的图可以理解为是数学上或者计算机科学中所说的图),并支持多种格式输出。语法首先,来简单看一下d...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

二叉树绘制器BinaryTreeDrawer实现

我们可能需要将一个二叉树以图形化的方式显示出来,我实现了一个二叉树绘制器BinaryTreeDrawer,用于绘制前文实现的二叉树。先看看这个绘制器的外貌:public interface IBina...

根据二叉树的先序和中序序列画出二叉树的方法

已知二叉树的先序和中序序列如下: 先序序列:1 2 4 6 3 5 7 8 中序序列:2 6 4 1 7 5 8 3 请画出该二叉树。 答: 先序序列的遍历顺序是先根节点,后左孩子,最后右孩...

数据结构 《4》---- 一个漂亮的打印二叉树的程序

一个漂亮地打印二叉树的一个小程序。

程序员的绘图利器 — Graphviz

概述   官网:http://www.graphviz.org/ Graphviz (Graph Visualization Software) 是一个由AT&T实验室启动的开源工具包。DOT是一种图...
  • zhangskd
  • zhangskd
  • 2012年12月04日 10:57
  • 17807

图形化二叉树演示软件

/*本程序具有 获取二叉树高度 获得叶子节点数 屏幕显示二叉树 添加 删除 查找 遍历功能。使用方法:进入时采用自定义的遍历方式,即从左到右,从上到下进行输入,空点以点代替。*/ #include #...

java实现二叉树的构建以及3种遍历方法

1.将一个数组构建成一颗二叉树的构建方法  2.代码实现  Java代码   package tree;      import java.util.LinkedList;  ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:画二叉树小工具
举报原因:
原因补充:

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