剑指offer——把二叉树打印成多行

Posted shengguilv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer——把二叉树打印成多行相关的知识,希望对你有一定的参考价值。

继续练习二叉树,原题目链接:把二叉树打印成多行

题目描述:

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

解题思路:

从上到下打印,从左到右输出;实质是要考察二叉树的遍历,不同于三种常用的遍历。

首先从根节点开始遍历;遍历到每个结点,就把该结点的左右结点一起存起来;由于需要返回的是一个列表,所以可以将打印输出改为存放到列表。

对于结点,可以使用队列进行存储,每遍历到一个结点,就把其左右子结点存入队列末尾;将队首结点的值打印,然后从队列取出该结点。

具体操作如下:

技术图片

 

 

对该树的打印过程:

技术图片

 参考了博文:从上往下打印二叉树(Java)

实现代码如下:

 注意:

使用队列的时候,不能直接new Queue;因为Queue是一个抽象类,而LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用

另外add()和remove()方法在失败的时候会抛出异常;所以一般使用offer()来加入元素,使用poll()来获取并移出元素。

参考了博文:Queue:poll、offer、element、peek

 1     ArrayList<Integer> Print(TreeNode pRoot){
 2         //新建一个存放树的值的集合
 3         ArrayList<Integer> list = new ArrayList<Integer>();
 4         if(pRoot == null){  //当树为空时,应该返回空,而不是null
 5             return list;
 6         }
 7 
 8         //建立队列存放树结点
 9         Queue<TreeNode> queue = new LinkedList<TreeNode>();
10         queue.offer(pRoot);
11         while(!queue.isEmpty()){
12             //每次需要将队首的结点值存在list中,然后去除该结点
13             TreeNode node = queue.poll();
14             list.add(node.val);
15             //每次将移除结点的左右节点加入队列
16              if(node.left != null){
17                  queue.offer(node.left);
18              }
19              if(node.right != null){
20                  queue.offer(node.right);
21              }
22         }
23         return list;
24     }

 

以上确实能够将二叉树按行进行打印,最终输出一行;但是,题目要求的最终输出并不是一行,而是多行;所以需要确定何时进行分行;按照上面的思路,是每次都把下一层的结点往后面加;若要分行,那便可以在添加下层结点之前先判断一下本层有多少个结点;当本层的结点都出队之后,打印一个换行即可;本题中则是再新建一个集合即可。

实现代码如下:

 1     ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
 2         //新建一个存放树的值的集合,分行存储
 3         ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
 4         if(pRoot == null){  //当树为空时,应该返回空,而不是null
 5             return list;
 6         }
 7         //建立队列存放树结点
 8         Queue<TreeNode> queue = new LinkedList<TreeNode>();
 9         queue.offer(pRoot);
10         while(!queue.isEmpty()){
11             //判断当前层结点的个数
12             int num = queue.size();
13             TreeNode node;
14             // 为每层结点定义一个结合
15             ArrayList<Integer> arrayList = new ArrayList<Integer>();
16             while(num > 0){
17                 //每次需要将队首的结点值存在arrayList集合中,然后去除该结点
18                 node = queue.poll();
19                 num--;
20                 arrayList.add(node.val);
21                 //每次将移除结点的左右节点加入队列
22                 if(node.left != null){
23                     queue.offer(node.left);
24                 }
25                 if(node.right != null){
26                     queue.offer(node.right);
27                 }
28             }
29             //将该层结点值的集合加入list中
30             list.add(arrayList);
31         }
32         return list;
33     }

此代码已通过测试。

 

以上是关于剑指offer——把二叉树打印成多行的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer---把二叉树打印成多行

《剑指offer》:[60]把二叉树打印成多行

剑指offer 60. 把二叉树打印成多行

剑指offer——把二叉树打印成多行

剑指offer——把二叉树打印成多行

剑指offer把二叉树打印成多行