剑指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——把二叉树打印成多行的主要内容,如果未能解决你的问题,请参考以下文章