树状显示二叉树

来源:互联网 发布:ftp连接阿里云 编辑:程序博客网 时间:2024/05/21 11:19

二叉树一个重要的数据结构,如何方便直观的显示一棵树对于学习非常重要。

 

现设计了如下算法:

      编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。

问题描述:
假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=2^6,假设节点的输出位置用(层号,须打印的空格数)来界定。
第0层:根在(0,32)处输出;
第1层:因为根节点缩进了32个空格,所以下一层的偏移量(offset)为32/2 = 16 = screenwidth/2^2。即第一层的两个节点的位置(1,32-offset),(1,32+offset) 即(1,16),(1,48)。
第2层:第二层的偏移量offset为screenwidth/23。第二层的四个节点的位置分别是(2,16-offset),(2,16+offset),(2,48-offset),(2,48+offset)即(2,8),(2,24),(2,40),(2,56)。……
第i层: 第i层的偏移量offset为screenwidth/2i+1。第i层的每个节点的位置是访问第i-1层其双亲节点时确定的。假设其双亲的位置为(i- 1,parentpos)。若其第i层的节点是其左孩子,那末左孩子的位置是(i,parentpos-offset),右孩子的位置是(i,parentpos+offset)。


利用二叉树的层次遍历算法实现。利用两个队列Q,QI。

队列Q中存放节点信息。

队列QI中存相应于队列Q中的节点的位置信息,包括层号、位置,是否换行、需要打印的空格数。

当节点被加入到Q时,根据前一个节点的信息来计算当期的打印信息,并且将相应的打印信息被存到QI中。

 

程序如下:

 

需要注意的是:如果将插入的结点和队尾的结点的level不同,说明需要换行

采用队列的方式是为了实现广度优先遍历:从根结点开始,一层一层的将结点加入到队列中。

遍历的过程也是显示的过程

结果如下

原创粉丝点击