C如何将“二叉树”绘制到控制台上


70

可以使用哪些算法在控制台中绘制二叉树?该树用C实现。例如,编号为:2 3 4 5 8的BST在控制台中显示为:

替代文字


2
创建一个包含您的节点和边的.dot文件,并使用graphviz对其进行渲染。看起来很整洁
Johannes Schaub-litb

@litb:很好。我实际上实现了一个渲染列表和一个帧缓冲区,并生成了自己的BMP!

请更新图片:)
Andreas Storvik Strauman

Answers:


46

在Ascii中签打印二叉树

来自下面的@AnyOneElse Pastbin:

输出:


正是我要找的东西,谢谢!
Marek Szanyi 2009年

2
不幸的是,事实似乎如此。在Google Cache或Internet Archive Wayback机器上找不到它。这可能是吧,我没试过尚未运行它: datastructuresblog.wordpress.com/2007/12/21/...
乔纳斯Elfström

文本似乎已损坏,并且代码链接已损坏。如果有人可以找到该代码,请帮忙!到pastebin的链接可能不会出现异常……
Norman Ramsey


1
我几年前将其移植到JS github.com/gaastonsr/treevis
Gaston Sanchez

48

码:

输出:

要么


7
+1用于递归实现和输出的BEAUTY。
OnTheEasiestWay 2014年

我试图将其与带有字符串值的树一起使用。即使增加width变量,效果也不佳。同样,固定数量的线也是不幸的。
Ray Hulha

20

一些提示:在相同深度(例如,您的示例中为2和4或3和8)的节点之间的间距是深度的函数。

从最左边的节点到最右边的节点,每个打印行都包含具有相同深度的所有节点。

因此,您需要一种方法,例如,根据节点的深度,按照其最左边的顺序将它们排列成行阵列。

从根节点开始,广度优先搜索将按深度和最左侧的顺序访问节点。

节点之间的间距可以通过以下方法找到:找到树的最大高度,对最深的节点使用某个恒定的宽度,对每一个较小的深度使用该宽度加倍,以便任何深度的宽度=(1 + maxdepth-currentdepth)* deepestwidth 。

该数字为您提供任何特定深度的每个节点的打印“水平宽度”。

左节点水平位于其父级宽度的左半部分,右节点位于右半部分。您将为没有父节点的任何节点插入虚拟垫片。一种更简单的方法是确保所有叶子与最深节点处于相同的深度,其值为空白。显然,您还必须补偿值的宽度,也许是通过使最大深度的宽度至少与最大值节点的打印(假定为十进制表示)宽度相同。


12

当在数组中实现一棵树时,还有另外一个方法:

输出:


8

我在c ++中有这个小解决方案-它可以很容易地转换为c。

我的解决方案确实需要一个补充数据结构来将当前节点的深度存储在树中(这是因为如果您使用的是不完整的树,则给定子树的深度可能与整个树中的深度不一致)。

它打印出以下内容:


谢谢。我正在使用您的解决方案,但有一个小错误。第二个q.push_back(node_depth(nd.n-> l,last_lvl + 1))应该是q.push_back(node_depth(nd.n-> r,last_lvl + 1))

@sank-不确定您在说什么-它确实已经计算出node_depth正确的子树的。也许您在复制时输入了错误的内容?这里的工作代码:ideone.com/wrY8Vo
Steve Lorimer

3

查看Linux中pstree命令的输出。它不会以您想要的确切形式生成输出,但是恕我直言,这种方式更具可读性。


3

我第二点建议。我最近不得不执行此操作以打印Windows进程的VAD树,并且使用了DOT语言(只需从二进制树遍历函数中打印出节点)即可:

http://en.wikipedia.org/wiki/DOT_language

例如,您的DOT文件将包含:

有向图graphname {
     5-> 3;
     5-> 8;
     3-> 4;
     3-> 2;
}

您可以使用dotty.exe生成图形,也可以使用dot.exe将其转换为PNG。


点很棒,但是这里的问题是ASCII
Norman Ramsey

2

一个非常简单的C ++解决方案在水平方向上打印树:

代码(Node::print()功能很重要):


1

我认为您不应该自己编写代码,而是看看Tree :: Visualize这似乎是一个不错的Perl实现,具有不同的可能样式,并在那里使用/移植一种算法。


1

我有一个Ruby程序,该程序计算应在此处绘制二叉树中的每个节点的坐标:http : //hectorcorrea.com/Blog/Drawing-a-Binary-Tree-in-Ruby

这段代码使用了非常基本的算法来计算坐标,虽然不是“高效区域”,但这是一个好的开始。如果您想查看代码“ live”,则可以在此处进行测试:http : //binarytree.heroku.com/


ASCII!问题要求输入ASCII。
诺曼·拉姆齐

@Norman-是的,的确如此,但是他也正在要求一种算法,他可以在我列出的帖子中找到它。
赫克托·科雷亚
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.