Skip to content

Commit 4cbc15e

Browse files
committed
feat: Add solution for LeetCode problem 102
1 parent 5747010 commit 4cbc15e

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
//
2+
// 102. Binary Tree Level Order Traversal
3+
// https://leetcode.com/problems/binary-tree-level-order-traversal/description/
4+
// Dale-Study
5+
//
6+
// Created by WhiteHyun on 2024/06/12.
7+
//
8+
9+
// MARK: - Node
10+
11+
private class Node<T> {
12+
let element: T
13+
var next: Node<T>?
14+
15+
init(element: T, next: Node<T>? = nil) {
16+
self.element = element
17+
self.next = next
18+
}
19+
}
20+
21+
// MARK: - Queue
22+
23+
final class Queue<T> {
24+
private var head: Node<T>?
25+
private var tail: Node<T>?
26+
private var count: Int = 0
27+
28+
var isEmpty: Bool {
29+
count == 0
30+
}
31+
32+
func enqueue(_ element: T) {
33+
let newNode = Node(element: element)
34+
35+
if let tailNode = tail {
36+
tailNode.next = newNode
37+
} else {
38+
head = newNode
39+
}
40+
41+
tail = newNode
42+
count += 1
43+
}
44+
45+
func dequeue() -> T? {
46+
guard let headNode = head
47+
else {
48+
return nil
49+
}
50+
51+
let element = headNode.element
52+
head = headNode.next
53+
54+
if head == nil {
55+
tail = nil
56+
}
57+
58+
count -= 1
59+
return element
60+
}
61+
62+
func peek() -> T? {
63+
head?.element
64+
}
65+
66+
func clear() {
67+
head = nil
68+
tail = nil
69+
count = 0
70+
}
71+
}
72+
73+
// MARK: ExpressibleByArrayLiteral
74+
75+
extension Queue: ExpressibleByArrayLiteral {
76+
convenience init(arrayLiteral elements: T...) {
77+
self.init()
78+
for element in elements {
79+
enqueue(element)
80+
}
81+
}
82+
}
83+
84+
class Solution {
85+
func levelOrder(_ root: TreeNode?) -> [[Int]] {
86+
guard let root else { return [] }
87+
var array: [[Int]] = []
88+
let queue: Queue<(node: TreeNode, layer: Int)> = [(root, 0)]
89+
90+
while let (node, layer) = queue.dequeue() {
91+
// array index 범위에 layer가 들어있지 않으면, 마지막 요소에 빈 배열 추가
92+
if (array.indices ~= layer) == false {
93+
array.append([])
94+
}
95+
array[layer].append(node.val)
96+
97+
if node.left != nil {
98+
queue.enqueue((node.left!, layer + 1))
99+
}
100+
if node.right != nil {
101+
queue.enqueue((node.right!, layer + 1))
102+
}
103+
}
104+
105+
return array
106+
}
107+
}

0 commit comments

Comments
 (0)