树状显示二叉树

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

 

现设计了如下算法:

      编写函数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不同,说明需要换行

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

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

结果如下

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值