题目
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
解题思路
来源于leetcode,作者:jyd
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/solution/mian-shi-ti-32-ii-cong-shang-dao-xia-da-yin-er-c-5/
来源:力扣(LeetCode)
方法一
其实和剑指 Offer 32 - I.差不多,就是在那个基础上加了一个断行的操作,就是在每一层后加一个断行,leetcode的大佬有两种做法,一种是直接加了一个for循环,巧妙的实现了断行操作,代码如下。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
if(root!=null){ queue.add(root); }
while(!queue.isEmpty()){
ArrayList<Integer> resTmp = new ArrayList<>();
for(int i=queue.size();i>0;i--){
TreeNode node = queue.poll();
resTmp.add(node.val);
if(node.left!=null){ queue.add(node.left); }
if(node.right!=null){ queue.add(node.right); }
}
res.add(resTmp);
// resTmp.clear();
}
return res;
}
}
在这里需要注意两个小细节,如下:
- 声明全局变量,然后采用clear()清除,以重复利用list,其实这是一个数组传地址引用的问题,每次clear后,会清除list中的所有元素,导致最终之前添加的都变成空,因为这里不是简单的传值,是属于传地址引用。错误示例如下:
- 应该把i=queue.size()放在首位,这样保证初始化一次,后续的queue改变后也不会造成影响,如果像下面这样就会造成影响,因为每次queue压入元素后就会造成长度的变化,如果放在判断语句部分,就会造成每次都会在变化。
方法二
这里的方法同样来源于leetcode,别人采用了递归的方式来做的,主要思想就是每次往下移动一层,就创建一个新的list,然后将下一层的节点压入,先压左边的,然后压右边的。
//public class Solution {
// private List<List<Integer>> ret;
//
// public List<List<Integer>> levelOrder(TreeNode root) {
// ret = new ArrayList<>();
// dfs(0, root);
// return ret;
// }
//
// private void dfs(int depth, TreeNode root) {
// if (root == null) {
// return;
// }
// if (ret.size() == depth) {
// ret.add(new ArrayList<>());
// }
// ret.get(depth).add(root.val);
// dfs(depth + 1, root.left);
// dfs(depth + 1, root.right);
// }
//}