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