Skip to content

Commit 0501468

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 45d187d + c2a2065 commit 0501468

29 files changed

+1219
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
from collections import deque
2+
from typing import Optional, List
3+
from unittest import TestCase, main
4+
5+
6+
# Definition for a binary tree node.
7+
class TreeNode:
8+
def __init__(self, val=0, left=None, right=None):
9+
self.val = val
10+
self.left = left
11+
self.right = right
12+
13+
14+
class Solution:
15+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
16+
return self.solve_dfs(root)
17+
18+
"""
19+
Runtime: 0 ms (Beats 100.00%)
20+
Time Complexity: O(n)
21+
> ๊ฐ node๋ฅผ bfs ๋ฐฉ์‹์œผ๋กœ ํ•œ ๋ฒˆ ์”ฉ ์กฐํšŒํ•˜๋ฏ€๋กœ O(n)
22+
23+
Memory: 17.42 (Beats 11.96%)
24+
Space Complexity: O(n)
25+
> ์ตœ์•…์˜ ๊ฒฝ์šฐ, deque์— ์ตœ๋Œ€ node์˜ ๊ฐฏ์ˆ˜๋งŒํผ ์ €์žฅ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ O(n), upper bound
26+
"""
27+
def solve_bfs(self, root: Optional[TreeNode]) -> List[List[int]]:
28+
if not root:
29+
return []
30+
31+
dq = deque([root])
32+
result = []
33+
while dq:
34+
tmp_result = []
35+
for _ in range(len(dq)):
36+
curr = dq.popleft()
37+
tmp_result.append(curr.val)
38+
39+
if curr.left:
40+
dq.append(curr.left)
41+
if curr.right:
42+
dq.append(curr.right)
43+
44+
result.append(tmp_result)
45+
46+
return result
47+
48+
"""
49+
Runtime: 1 ms (Beats 38.71%)
50+
Time Complexity: O(n)
51+
> ๊ฐ node๋ฅผ dfs ๋ฐฉ์‹์œผ๋กœ ํ•œ ๋ฒˆ ์”ฉ ์กฐํšŒํ•˜๋ฏ€๋กœ O(n)
52+
53+
Memory: 17.49 (Beats 11.96%)
54+
Space Complexity: O(1)
55+
> ์ตœ์•…์˜ ๊ฒฝ์šฐ, list์— ์ตœ๋Œ€ node์˜ ๊ฐฏ์ˆ˜๋งŒํผ ์ €์žฅ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ O(n), upper bound
56+
"""
57+
def solve_dfs(self, root: Optional[TreeNode]) -> List[List[int]]:
58+
if not root:
59+
return []
60+
61+
def dfs(node: TreeNode, depth: int):
62+
if len(result) <= depth:
63+
result.append([node.val])
64+
else:
65+
result[depth].append(node.val)
66+
67+
if node.left:
68+
dfs(node.left, depth + 1)
69+
if node.right:
70+
dfs(node.right, depth + 1)
71+
72+
result = []
73+
dfs(root, 0)
74+
75+
return result
76+
77+
78+
class _LeetCodeTestCases(TestCase):
79+
80+
def test_1(self):
81+
root = TreeNode(3)
82+
node1 = TreeNode(9)
83+
node2 = TreeNode(20)
84+
node3 = TreeNode(15)
85+
node4 = TreeNode(7)
86+
root.left = node1
87+
root.right = node2
88+
node2.left = node3
89+
node2.right = node4
90+
output = [[3], [9, 20], [15, 7]]
91+
self.assertEqual(Solution.levelOrder(Solution(), root), output)
92+
93+
def test_2(self):
94+
root = TreeNode(1)
95+
node1 = TreeNode(2)
96+
node2 = TreeNode(3)
97+
node3 = TreeNode(4)
98+
node4 = TreeNode(5)
99+
root.left = node1
100+
root.right = node2
101+
node1.left = node3
102+
node2.left = node4
103+
output = [[1], [2, 3], [4, 5]]
104+
self.assertEqual(Solution.levelOrder(Solution(), root), output)
105+
106+
107+
if __name__ == '__main__':
108+
main()
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// class TreeNode {
2+
// val: number;
3+
// left: TreeNode | null;
4+
// right: TreeNode | null;
5+
// constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
6+
// this.val = val === undefined ? 0 : val;
7+
// this.left = left === undefined ? null : left;
8+
// this.right = right === undefined ? null : right;
9+
// }
10+
// }
11+
12+
/**
13+
* https://leetcode.com/problems/binary-tree-level-order-traversal
14+
* T.C. O(n)
15+
* S.C. O(n)
16+
*/
17+
function levelOrder(root: TreeNode | null): number[][] {
18+
const result: number[][] = [];
19+
function dfs(node: TreeNode | null, level: number) {
20+
if (!node) return;
21+
if (!result[level]) result[level] = [];
22+
result[level].push(node.val);
23+
dfs(node.left, level + 1);
24+
dfs(node.right, level + 1);
25+
}
26+
dfs(root, 0);
27+
return result;
28+
}
29+
30+
/**
31+
* bfs
32+
* T.C. O(n)
33+
* S.C. O(n)
34+
*/
35+
function levelOrder(root: TreeNode | null): number[][] {
36+
const result: number[][] = [];
37+
if (!root) return result;
38+
39+
const queue: TreeNode[] = [root];
40+
let start = 0;
41+
42+
while (queue[start]) {
43+
const levelSize = queue.length - start;
44+
const currentLevel: number[] = [];
45+
46+
for (let i = 0; i < levelSize; i++) {
47+
const node = queue[start++];
48+
currentLevel.push(node.val);
49+
if (node.left) queue.push(node.left);
50+
if (node.right) queue.push(node.right);
51+
}
52+
53+
result.push(currentLevel);
54+
}
55+
56+
return result;
57+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// TC: O(n)
2+
// need to visit all nodes
3+
// SC: O(n)
4+
// normally O(log n) required however, O(n) in the worst case
5+
class Solution {
6+
private List<List<Integer>> output = new ArrayList<>();
7+
public List<List<Integer>> levelOrder(TreeNode root) {
8+
dfs(0, root);
9+
return output;
10+
}
11+
12+
private void dfs(int level, TreeNode node) {
13+
if (node == null) return;
14+
15+
if (output.size() == level) {
16+
List<Integer> inside = new ArrayList<>();
17+
inside.add(node.val);
18+
output.add(inside);
19+
} else {
20+
output.get(level).add(node.val);
21+
}
22+
level += 1;
23+
dfs(level, node.left);
24+
dfs(level, node.right);
25+
}
26+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
ํ’€์ด
3+
- queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ’€์ดํ•ฉ๋‹ˆ๋‹ค
4+
Big O
5+
- N: ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
6+
- Time complexity: O(N)
7+
- ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค
8+
- Space complexity: O(N)
9+
- ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ๊ฐ’์ธ 2์ฐจ์› ๋ฐฐ์—ด levels -> O(N)
10+
- queue -> O(3/4 * N) = O(N)
11+
- ํ•œ ์ธต์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋Š” ์•ฝ N / 2
12+
- queue์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ํด ๋•Œ๋Š” ๋‘ ์ธต์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ N / 2 + (N / 2) / 2 ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ–๊ฒŒ ๋จ
13+
- level -> O(N/2) = O(N)
14+
- - ํ•œ ์ธต์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋Š” ์•ฝ N / 2
15+
*/
16+
17+
/**
18+
* Definition for a binary tree node.
19+
* type TreeNode struct {
20+
* Val int
21+
* Left *TreeNode
22+
* Right *TreeNode
23+
* }
24+
*/
25+
func levelOrder(root *TreeNode) [][]int {
26+
levels := make([][]int, 0)
27+
28+
if root == nil {
29+
return levels
30+
}
31+
32+
queue := make([]*TreeNode, 0)
33+
queue = append(queue, root)
34+
for len(queue) > 0 {
35+
k := len(queue)
36+
level := make([]int, k)
37+
for i := 0; i < k; i++ {
38+
node := queue[i]
39+
level[i] = node.Val
40+
if node.Left != nil {
41+
queue = append(queue, node.Left)
42+
}
43+
if node.Right != nil {
44+
queue = append(queue, node.Right)
45+
}
46+
}
47+
queue = queue[k:]
48+
levels = append(levels, level)
49+
}
50+
51+
return levels
52+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
6+
class `binary-tree-level-order-traversal` {
7+
8+
fun levelOrder(root: TreeNode?): List<List<Int>> {
9+
return if (root == null) emptyList()
10+
else usingDFS(root)
11+
}
12+
13+
/**
14+
* TC: O(n), SC: O(n)
15+
*/
16+
private fun usingBFS(root: TreeNode): List<List<Int>> {
17+
val queue = ArrayDeque<TreeNode>().apply {
18+
this.add(root)
19+
}
20+
21+
val result = mutableListOf<List<Int>>()
22+
while (queue.isNotEmpty()) {
23+
val values = mutableListOf<Int>()
24+
repeat(queue.size) {
25+
val node = queue.removeFirst()
26+
values.add(node.`val`)
27+
node.left?.also { queue.add(it) }
28+
node.right?.also { queue.add(it) }
29+
}
30+
result.add(values)
31+
}
32+
33+
return result
34+
}
35+
36+
/**
37+
* TC: O(n), SC: O(n)
38+
*/
39+
private fun usingDFS(root: TreeNode): List<List<Int>> {
40+
41+
fun dfs(node: TreeNode, result: MutableList<MutableList<Int>>, depth: Int) {
42+
if (depth >= result.size) {
43+
result.add(mutableListOf())
44+
}
45+
result[depth].add(node.`val`)
46+
node.left?.also { dfs(it, result, depth + 1) }
47+
node.right?.also { dfs(it, result, depth + 1) }
48+
}
49+
50+
return mutableListOf<MutableList<Int>>().apply {
51+
dfs(root, this, 0)
52+
}
53+
}
54+
55+
@Test
56+
fun `ํŠธ๋ฆฌ ๋…ธ๋“œ๋ฅผ ๊นŠ์ด ๋ณ„๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค`() {
57+
levelOrder(TreeNode.of(3,9,20,null,null,15,7)) shouldBe listOf(
58+
listOf(3),
59+
listOf(9,20),
60+
listOf(15,7)
61+
)
62+
}
63+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution:
2+
# ์‹œ๊ฐ„๋ณต์žก๋„: O(N)
3+
# ๊ณต๊ฐ„๋ณต์žก๋„: O(N)
4+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
5+
def traverse(node, level):
6+
if not node:
7+
return
8+
9+
if len(result) <= level:
10+
result.append([])
11+
12+
result[level].append(node.val)
13+
14+
traverse(node.left, level + 1)
15+
traverse(node.right, level + 1)
16+
17+
result = []
18+
traverse(root, 0)
19+
return result
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from collections import deque
2+
from typing import List, Optional
3+
4+
5+
class TreeNode:
6+
def __init__(self, val=0, left=None, right=None):
7+
self.val = val
8+
self.left = left
9+
self.right = right
10+
11+
12+
class Solution:
13+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
14+
"""
15+
- Idea: ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋‹จ๊ณ„ ๋ณ„๋กœ ์ˆœํšŒํ•œ๋‹ค.
16+
- Time Complexity: O(n). n์€ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ์ˆ˜.
17+
๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•˜๋ฏ€๋กœ O(n) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
18+
- Space Complexity: O(n). n์€ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ์ˆ˜.
19+
๊ฐ€์žฅ ์•„๋ž˜ ๋‹จ๊ณ„์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ด๋Š” n์— ๋น„๋ก€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(n) ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
20+
"""
21+
if not root:
22+
return []
23+
24+
result = []
25+
queue = deque()
26+
queue.append(root)
27+
28+
while queue:
29+
level = []
30+
31+
for i in range(len(queue)):
32+
node = queue.popleft()
33+
level.append(node.val)
34+
35+
if node.left:
36+
queue.append(node.left)
37+
if node.right:
38+
queue.append(node.right)
39+
40+
result.append(level)
41+
42+
return result

0 commit comments

Comments
ย (0)