解法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 {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
Deque<TreeNode> que = new ArrayDeque<>();
que.add(root);
while (!que.isEmpty()) {
int size = que.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode t = que.poll();
list.add(t.val);
if (t.left != null) {
que.add(t.left);
}
if (t.right != null) {
que.add(t.right);
}
}
res.add(list);
}
return res;
}
}
解法二
- 对于先序遍历,我们换个角度来看,我们会发现,先序遍历时对于每层的遍历都是从左往右的,那么不是正好符合我们层序序列的要求,我们只需要在遍历时加入到相应层的List中即可。
/**
* 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>> res = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
recur(root, 1);
return res;
}
// 由于先序遍历方式在每层的遍历方式上依旧符合层序遍历方式
// 所以只需在遍历到该节点的时候添加到相应层数即可
private void recur(TreeNode root, int depth) {
if (root == null) return;
if (depth > res.size()) {
res.add(new ArrayList<>());
}
res.get(depth - 1).add(root.val);
recur(root.left, depth + 1);
recur(root.right, depth + 1);
}
}