https://leetcode.com/problems/binary-tree-level-order-traversal/description/
트리 레벨 별 노드를 리스트에 담아서 주면 된다는 것 같은데, 대놓고 BFS 문제인 것 같다.
이렇게 각 순회마다 레벨 정보를 알고 있어야 풀 수 있는 문제라면,
대표적으로 두 가지 방법으로 풀어낼 수 있다.
큐에 넣을 때 level + 1을 해서 가지고 다닌다(Wrapping class나 배열 등..).
이렇게 하면, 큐 안에서는 레벨 별 분기나 순회를 아예 고려하지 않고 논리적으로 current node + 1의 값만으로 모든 논리적 판단을 할 수 있다.
BFS를 정말 레벨 단위로 구현한다.
while loop 한 번에 한 개의 노드만 다루는 것이 아니고, 내부적으로 다시 que size만큼 반복하여 명시적으로 while loop는 레벨에 대한 순회로 여기도록 하는 것이다.
가독성 면에서는 2번이 좋은 것 같기도 하고..
특히 이 문제에 대해서는 별도 Wrapping도 필요없이 결과 리스트에 add만 하면 되는 방식이므로 2번으로 푼다.
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while (!que.isEmpty()) {
int size = que.size();
List<Integer> levelNodes = new ArrayList<>();
for (int i=0; i<size; i++) {
TreeNode current = que.poll();
levelNodes.add(current.val);
if (current.left != null) {
que.offer(current.left);
}
if (current.right != null) {
que.offer(current.right);
}
}
result.add(levelNodes);
}
return result;
}
}