有一篇旧文写的是在终端或文件中图形化打印二叉树,当时使用了 队列
,但后来在学到二叉树的 层次遍历
的时候才意识到当时的实现是真的……蹩脚。
二叉树的层次遍历
如图所示二叉树:
.--------- 1 ---------.
.---- 2 ----. .----3----.
4 5 6 7
层次遍历结果:1 2 3 4 5 6 7
层次遍历符合先入先出 FIFO
的原则,适合使用 队列
来实现
过程描述:
1 入队 queue: 1
1 出队,打印 1,1 的左结点 2 入队,右结点 3 入队 queue: 2, 3
2 出队,打印 2,2 的左结点 4 入队,右结点 5 入队 queue: 3, 4, 5
3 出队,打印 3,3 的左结点 6 入队,右结点 7 入队 queue: 4, 5, 6, 7
4 出队,打印 4,4 的左结点为 null,不入队,右结点为 null, 不入队 queue: 5, 6, 7
5 出队,打印 5,5 的左结点为 null,不入队,右结点为 null, 不入队 queue: 6, 7
6 出队,打印 6,6 的左结点为 null,不入队,右结点为 null, 不入队 queue: 7
7 出队,打印 7,7 的左结点为 null,不入队,右结点为 null, 不入队 queue:
队空,遍历结束
代码示例:(用Java写过,就直接贴上来了)
//levelorder
public void levelorder() {
System.out.println("levelorder:");
LinkedQueue<BinaryNode<T>> queue = new LinkedQueue<BinaryNode<T>>();
queue.add(root);
while (!queue.isEmpty()) {
BinaryNode<T> p = queue.poll();
System.out.print(p.toString() + " ");
if (p != null) {
if (p.left != null) queue.add(p.left);
if (p.right != null) queue.add(p.right);
}
}
System.out