
Description
주어진 트리를 층별로 순회하며 순서대로 층별 요소의 목록을 반환하는 문제입니다. Given the root of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level).
Example 1:
Input: root = [3,9,20,null,null,15,7]
Output: [[3],[9,20],[15,7]]
Example 2:
Input: root = [1]
Output: [[1]]
Example 3:
Input: root = []
Output: []
Constraints:
- The number of nodes in the tree is in the range [0, 2000].
- -1000 <= Node.val <= 1000
Solution 1. DFS - Recursion(재귀)
public List<List<Integer>> levelOrder(TreeNode root) {
//1. Recursion(DFS)
List<List<Integer>> result = new ArrayList<List<Integer>>();
levelorderTraversal(result,0,root);
return result;
}
private void levelorderTraversal(List<List<Integer>> result, int level, TreeNode node) {
if(node == null){return;}
if(result.size() <= level){ // 현재 level List가 없을 경우 ex)size가 1이면 0뎁스까지밖에 없음. 1뎁스일때 만들어줘야함.
List<Integer> row = new ArrayList<>();
row.add(node.val);
result.add(row);
}else{
List<Integer> row = result.get(level);
row.add(node.val);
}
levelorderTraversal(result, level+1,node.left);
levelorderTraversal(result, level+1,node.right);
}
깊이우선탐색(DFS)과 유사하게 재귀호출을 통해 탐색하는 방법입니다. level별로 List를 만들어주기 위해 각 노드를 재귀호출할때 level을 넘겨주고 해당 level의 list가 없으면 새로 생성해준 뒤 요소를 추가해줍니다.
Solution 2. BFS - Queue
public List<List<Integer>> levelOrder2(TreeNode root) {
//2. Iteration (BFS with Queue)
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root == null)return result;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(!q.isEmpty()){
int qSize = q.size();
List<Integer> row = new ArrayList<>();
for (int i = 0; i < qSize; i++) {
TreeNode cur = q.poll();
row.add(cur.val);
if(cur.left != null) q.offer(cur.left);
if(cur.right != null) q.offer(cur.right);
}
result.add(row);
}
return result;
}
너비우선 탐색(BFS)으로 큐를 이용한 방법입니다. 먼저 루트값을 list에 쓴뒤 left,right순으로 queue에 담아 순차적으로 값을 읽어냅니다. level별 List는 각 queue의 사이즈를 체크하여 만들어줍니다.
Reference
Binary Tree Level Order Traversal - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
LeetCode, Algorithm, String, Hash Table, LinkedList, Depth-First Search, Breadth-First Search, Matrix, TwoPoint, Array, Recusion, 릿코드, 알고리즘, 코딩테스트, 코테, 문제풀이
Binary Tree, Recusion, 전위순회, inorder-traversal
중위순회, inorder-traversal, 후위순회, postorder-traversal,
'알고리즘 > LeetCode' 카테고리의 다른 글
[LeetCode] 258. Add Digits - 문제풀이 (0) | 2022.02.08 |
---|---|
[LeetCode] 389. Find the Difference - 문제풀이 (0) | 2022.02.07 |
[LeetCode] 80. Remove Duplicates from Sorted Array II - 문제풀이 (0) | 2022.02.06 |
[LeetCode] 120. Triangle - 문제풀이 (0) | 2022.02.06 |
[LeetCode] 198. House Robber - 문제풀이 (0) | 2022.02.05 |