반응형
https://leetcode.com/problems/binary-tree-level-order-traversal/
2. 2022/05/11 시도
소요시간: 4분(iterative), 5분(recursive)
// iterative
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<>();
if (root == null) {
return ret;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()) {
int size = queue.size();
List<Integer> inner = new ArrayList<>();
for (int i=0; i<size; i++) {
TreeNode node = queue.poll();
inner.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
ret.add(inner);
}
return ret;
}
}
// recursive
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<>();
doLevelOrder(root, 0, ret);
return ret;
}
private void doLevelOrder(TreeNode root, int depth, List<List<Integer>> ret) {
if (root == null) {
return;
}
if (ret.size() == depth) {
List<Integer> inner = new ArrayList<>();
inner.add(root.val);
ret.add(inner);
} else {
ret.get(depth).add(root.val);
}
doLevelOrder(root.left, depth+1, ret);
doLevelOrder(root.right, depth+1, ret);
}
}
풀이 접근 과정
iterative
- bfs를 queue로 푸는 전형적인 문제다.
- queue를 레벨별로 분리함으로 층별로 size를 미리 받아놓고 그만큼만 돌린다.
- 레벨이 끝날때마다 ret에 저장하면 끝
recursive
- depth를 넘겨서 위치를 확인한다.
- ret.size()는 전체 depth의 깊이와 같다. depth가 size가 같다는 것은 해당 depth에 처음으로 진입함을 의미함으로 list를 만들어준다.
- 이미 진입한 depth에는 list가 만들어져있으므로 add만 해주면 된다.
느낀점
- iterative는 거의 외우다시피 해서 그런지 쉽게 풀렸다.
- recurisve는 size와 depth를 이용해서 푸는 문제가 많았떤 것으로 기억해서 이런 풀이를 익혀두면 좋겠다.
1. 2021/01/21 시도
소요시간: 10분
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.push(root);
while (!queue.isEmpty()) {
List<Integer> level = new ArrayList<>();
LinkedList<TreeNode> next = new LinkedList<>();
while(!queue.isEmpty()) {
TreeNode cur = queue.pollLast();
if (cur.left != null) next.push(cur.left);
if (cur.right != null) next.push(cur.right);
level.add(cur.val);
}
result.add(level);
queue = next;
}
return result;
}
}
풀이 접근 과정
iterative하게 queue를 쓰고 쌓인걸 모두 pop하면서 저장하면 되겠다.
느낀점
- recursive하게는 딱 안 떠올랐는데 level을 파라미터 추가 변수로 주면 잘된다.
알고리즘 정리노트: .leetcode(알고리즘 문제풀이 접근)
반응형
'알고리즘 풀이' 카테고리의 다른 글
.leetcode(101. Symmetric Tree) (0) | 2022.05.11 |
---|---|
.leetcode(104. Maximum Depth of Binary Tree) (0) | 2022.05.11 |
.leetcode(145. Binary Tree Postorder Traversal) (0) | 2022.05.11 |
.leetcode(94. Binary Tree Inorder Traversal) (0) | 2022.05.10 |
.leetcode(144. Binary Tree Preorder Traversal) (0) | 2022.05.10 |