题目
解析
1.迭代,借助队列
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<List<Integer>> resList = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
checkFun(root);
return resList;
}
public void checkFun(TreeNode root) {
if (root == null) {
return;
}
Queue<TreeNode> que = new LinkedList<>(); // 用队列储存每一层的节点
que.offer(root);
while (!que.isEmpty()) {
List<Integer> itemList = new ArrayList<>(); // 每一层用一个list储存
int len = que.size(); // 计算一层多少个节点,作为循环判断条件
while (len > 0) {
TreeNode tempNode = que.poll(); // 取出第一个节点
itemList.add(tempNode.val);
if (tempNode.left != null) { // 添加左
que.offer(tempNode.left);
}
if (tempNode.right != null) {// 添加右
que.offer(tempNode.right);
}
len--; // 进入同一层的下一个节点
}
resList.add(itemList); // 一层之后把list添加
}
}
}
2.递归解法
public void checkFun01(TreeNode node, Integer deep) {
if (node == null) return;
deep++;
if (resList.size() < deep) {
//当层级增加时,list的Item也增加,利用list的索引值进行层级界定
List<Integer> item = new ArrayList<Integer>();
resList.add(item);
}
resList.get(deep - 1).add(node.val); // 不能直接list.add(node.val),因为编译的时候找不到list
checkFun01(node.left, deep);
checkFun01(node.right, deep);
}