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