1 题目
2 Java
2.1 方法一(层序迭代,队列)
在层序遍历的基础上,记录层的节点数
/**
* 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) {
List<List<Integer>> listList = new ArrayList<List<Integer>>();
if(root == null) return listList;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
int level = 0;
while(!queue.isEmpty()){
// !!!先添加新的一层
// if(listList.size() < level + 1) listList.get(level) = new LinkedList<>(); 沙雕写法
listList.add(new ArrayList<>());
// 处理queue当前所有节点,本次while循环里入队的元素 等下一个while循环处理;即一次处理一层
// for(int i = 0; i < queue.size(); i++){ // !!!咋又犯这错呢小老弟
int num = queue.size();
for(int i = 0; i < num; i++){
// 出队,记录结果
root = queue.poll();
listList.get(level).add(root.val);
// 入队
if(root.left != null) queue.add(root.left);
if(root.right != null) queue.add(root.right);
}
level++;
}
return listList;
}
}
2.2 !方法二(前序递归+递归参数level)
递归函数加一个参数level记录层,将层数作为索引,把值加入答案
递归方法的作用:将当前节点值放入嵌套集合对应的位置
递归方法本身在前序遍历树,当遍历完成,嵌套集合也被填充完毕
// 嵌套集合加入空集合的操作:
listList.add(new LinkedList<Integer>());
// 嵌套集合不需要辅助list直接赋值的操作:
listList.get(level).add(root.val);
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<List<Integer>> listList = new LinkedList<List<Integer>>();
public List<List<Integer>> levelOrder(TreeNode root) {
helper(root, 0);
return listList;
}
public void helper(TreeNode root,int level){
if(root == null) return;
// 比前序遍历就多了这一行!!!如果是新的一层,listList加一个空集合
if(listList.size() == level) listList.add(new LinkedList<Integer>());
// 记录值
listList.get(level).add(root.val);
helper(root.left, level + 1);
helper(root.right, level + 1);
}
}