티스토리 뷰
Algorithm/LeetCode
[LeetCode] 103. Binary Tree Zigzag Level Order Traversal
Jaime.Lee 2023. 7. 20. 04:05Problem
Given the root of a binary tree, return the zigzag level order traversal of its nodes' values. (i.e., from left to right, then right to left for the next level and alternate between).
Example 1:
Input: root = [3,9,20,null,null,15,7]
Output: [[3],[20,9],[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].
- -100 <= Node.val <= 100
Solution
이진 트리의 루트 노드를 입력받아 "지그재그" 형태로 레벨 순서대로 노드 값을 반환하는 문제입니다.
package io.lcalmsky.leetcode.binary_tree_zigzag_level_order_traversal;
import io.lcalmsky.leetcode.TreeNode;
import java.util.*;
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) {
return Collections.emptyList();
}
List<List<Integer>> orders = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
List<Integer> order;
queue.offer(root);
int level = 1;
while (!queue.isEmpty()) {
order = new ArrayList<>();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode poll = queue.remove();
if (level % 2 == 1) {
order.add(poll.val);
} else {
order.add(0, poll.val);
}
if (poll.left != null) {
queue.offer(poll.left);
}
if (poll.right != null) {
queue.offer(poll.right);
}
}
orders.add(order);
level++;
}
return orders;
}
}
주어진 이진 트리를 레벨 순서대로 탐색하기 위해 큐(Queue)를 사용합니다. 큐는 BFS(Breadth-First Search) 알고리즘을 구현하기 위해 활용됩니다.
먼저, 주어진 루트 노드가 null인 경우, 빈 리스트를 반환합니다.
그렇지 않은 경우, 결과를 저장할 리스트인 orders와 노드를 저장할 큐인 queue를 생성합니다. 또한, 현재 레벨의 순서에 따라 노드 값을 저장할 리스트인 order를 초기화합니다. 루트 노드를 큐에 추가한 후, 레벨을 나타내는 변수 level을 1로 초기화합니다.
큐가 비어 있지 않은 동안 반복합니다.
- order 리스트를 초기화합니다.
- 큐의 현재 크기를 저장한 후, 해당 크기만큼 반복하면서 큐에서 노드를 하나씩 제거합니다.
- 현재 레벨이 홀수인 경우, 노드 값을 order 리스트에 추가합니다.
- 현재 레벨이 짝수인 경우, 노드 값을 order 리스트의 맨 앞에 추가합니다.
- 현재 노드의 왼쪽 자식이 존재하는 경우, 왼쪽 자식을 큐에 추가합니다.
- 현재 노드의 오른쪽 자식이 존재하는 경우, 오른쪽 자식을 큐에 추가합니다.
- 현재 레벨의 order 리스트를 orders 리스트에 추가합니다.
- 다음 레벨로 넘어가기 위해 level을 증가시킵니다.
모든 반복이 완료되면 orders 리스트를 반환합니다.
이 알고리즘은 BFS를 통해 이진 트리를 레벨 순서대로 탐색하며, 각 레벨에 대해 지그재그 형태로 노드 값을 저장합니다.
Test
package io.lcalmsky.leetcode.binary_tree_zigzag_level_order_traversal;
import io.lcalmsky.leetcode.TreeNode;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SolutionTest {
@Test
void testAll() {
assertAll(
() -> test(TreeNode.of(3, 9, 20, null, null, 15, 7), List.of(List.of(3), List.of(20, 9), List.of(15, 7))),
() -> test(TreeNode.of(1), List.of(List.of(1)))
);
}
private void test(TreeNode root, List<List<Integer>> expected) {
// when
Solution solution = new Solution();
List<List<Integer>> actual = solution.zigzagLevelOrder(root);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode] 155. Min Stack (0) | 2023.07.22 |
---|---|
[LeetCode] 300. Longest Increasing Subsequence (0) | 2023.07.21 |
[LeetCode] 22. Generate Parentheses (1) | 2023.07.19 |
[LeetCode] 150. Evaluate Reverse Polish Notation (0) | 2023.07.18 |
[LeetCode] 380. Insert Delete GetRandom O(1) (1) | 2023.07.17 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- spring boot jwt
- spring boot application
- 스프링 부트 회원 가입
- leetcode
- @ManyToOne
- Spring Boot JPA
- 알고리즘
- 스프링 부트 애플리케이션
- JPA
- intellij
- Java
- gRPC
- 함께 자라기 후기
- Spring Data JPA
- 클린 아키텍처
- proto3
- Spring Boot Tutorial
- JSON
- 스프링 부트 튜토리얼
- 스프링 데이터 jpa
- spring boot app
- r
- Spring Boot
- 함께 자라기
- 스프링 부트
- Jackson
- 헥사고날 아키텍처
- QueryDSL
- Linux
- 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함