二叉树相关算法设计题

一.

题目:

二叉树按层打印,同时输出格式满足:打印完一层要换行,每一行的行首标明:level  i(i=1,2,3...层)

思路:1.先把二叉树的层次遍历搞懂:

        用队列实现,原理是:根节点入队,然后在队列不空的时候循环,循环体操作为:抛出队首元素并向队尾添加该抛出节点的左右子节点(如果不为空的话)

   2.题目有两个额外的要求。a.换行打印。b.打印行号。其实就是让我们在层次遍历时遇到每一层的最右节点出队打印时换行并打印行号,

      其实a和b是一样的,只要知道怎么换行,在换行时加上level++的打印字段既可以了。

     3.注意到:上一层的最右节点的打印导致:a.上一层打印结束,该换行了;b.此时队尾必定是下一层的最右一个元素,因为出队打印必天剑左右子节点,如果有的话。这个信息就是解题的关键所在。

     4.代码如下:关键在于:用cur与last两个标记,分别标记了:上一层的最右一个节点与一直往队尾添加的节点。如此,在每打印一次并且已经做了添加左右子节点的工作后,加上判断是否temp==cur,就轻松掌握了每一层结束的时机了。

 1 private static void showByLevel(node head) {
 2         if (head == null)
 3             return;
 4         Queue<node> queue = new LinkedList<>();// 可以用作队列
 5         queue.offer(head);
 6         node cur = head;// 标记上一层的最右一个节点
 7         node last = null;// 标记一直往队尾添加的节点
 8         int level = 1;
 9         System.out.print("level" + (level++) + ":");
10         while (!queue.isEmpty()) {
11             node temp = queue.poll();
12             System.out.print(temp.val + "  ");
13 
14             if (temp.left != null) {
15                 queue.offer(temp.left);
16                 last = temp.left;// offer方法如果容量不足则抛出异常让你处理;add方法则是返回false
17             }
18             if (temp.right != null) {
19                 queue.offer(temp.right);
20                 last = temp.right;
21             }
22             if (temp == cur && !queue.isEmpty()) {
23                 System.out.println("\nlevel" + (level++) + ":");
24                 cur = last;
25             }
26         }
27     }

猜你喜欢

转载自www.cnblogs.com/zclun/p/10651650.html