From 87c2e01fcb84aa130a621d865e3d00790a0e68d3 Mon Sep 17 00:00:00 2001 From: Yota Maeda Date: Tue, 14 Jul 2026 21:38:06 +0900 Subject: [PATCH 1/3] step1 --- 102-Binary-Tree-Level-Order-Traversal/note.md | 17 ++++++++++ .../step1.py | 31 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 102-Binary-Tree-Level-Order-Traversal/note.md create mode 100644 102-Binary-Tree-Level-Order-Traversal/step1.py diff --git a/102-Binary-Tree-Level-Order-Traversal/note.md b/102-Binary-Tree-Level-Order-Traversal/note.md new file mode 100644 index 0000000..c2b11cc --- /dev/null +++ b/102-Binary-Tree-Level-Order-Traversal/note.md @@ -0,0 +1,17 @@ +# 102. Binary Tree Level Order Traversal + +https://leetcode.com/problems/binary-tree-level-order-traversal/ + +## step1(まず通す) + +幅優先探索をする時に階層ごとにループを回せばいい。 + +ノード数 n に対して時間計算量 O(n)、空間計算量 O(n) + +ノード数の上限は 2000 であり各ノードについて val の取得、子の None 判定とリストへの append などを行う程度なので、計算回数は `2000 * 10 = 2 * 10 ^ 4`くらい、計算時間は 数十 ms くらいか。 + +## step2(整形&他の人のコードを読む) + + + +## step3(10分以内にさっとかける \* 3回) diff --git a/102-Binary-Tree-Level-Order-Traversal/step1.py b/102-Binary-Tree-Level-Order-Traversal/step1.py new file mode 100644 index 0000000..e81d9cd --- /dev/null +++ b/102-Binary-Tree-Level-Order-Traversal/step1.py @@ -0,0 +1,31 @@ +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + + +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> list[list[int]]: + if root is None: + return [] + + nodes: list[TreeNode] = [root] + traversal: list[list[int]] = [] + while nodes: + values: list[int] = [] + next_layer: list[TreeNode] = [] + for node in nodes: + values.append(node.val) + if node.left is not None: + next_layer.append(node.left) + if node.right is not None: + next_layer.append(node.right) + + traversal.append(values) + nodes = next_layer + + return traversal From bd153aa7a2c3494c038b2b55509403b4794a7621 Mon Sep 17 00:00:00 2001 From: Yota Maeda Date: Tue, 14 Jul 2026 21:56:29 +0900 Subject: [PATCH 2/3] step2 --- 102-Binary-Tree-Level-Order-Traversal/note.md | 11 ++++++- .../step2.py | 31 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 102-Binary-Tree-Level-Order-Traversal/step2.py diff --git a/102-Binary-Tree-Level-Order-Traversal/note.md b/102-Binary-Tree-Level-Order-Traversal/note.md index c2b11cc..d188c0f 100644 --- a/102-Binary-Tree-Level-Order-Traversal/note.md +++ b/102-Binary-Tree-Level-Order-Traversal/note.md @@ -12,6 +12,15 @@ https://leetcode.com/problems/binary-tree-level-order-traversal/ ## step2(整形&他の人のコードを読む) - +- https://github.com/shintaro1993/arai60/pull/30/changes + - この方もそうだし、問題タイトルや文でも level という語が使われている(し、level のほうがよく聞く気がする)ので layer -> level に変数名を変更 +- https://github.com/naoto-iwase/leetcode/pull/30/changes#diff-40c0807c5c71abb50c5c8ebe78ffc21551f9ab6d80ccd6a156c960d1febd1882R19 + - 「キューにはNoneでないことを確かめていれる方が経験で見通しよく書けるので、そうする。」 + - 見通しの他に、None を探索詰めないことで探索回数が半分程度に減るというメリットもありそう。 +- https://github.com/naoto-iwase/leetcode/pull/30/changes#diff-40c0807c5c71abb50c5c8ebe78ffc21551f9ab6d80ccd6a156c960d1febd1882R20 + - 「計算量 Time: O(V + E) = O(V), Space: O(width) = O(V)」 + - 自分では全部のノードを見るから O(V)、と雑に考えていたが、実際には高さの回数ループが回り、その中で同じ高さのノードの数だけループが回るという構造であることに気をつける必要がある +- https://github.com/tom4649/Coding/pull/25/changes + - 変数名 traversal はちょっと変な気がするので、この方が使っている `values_by_level` とか他の方が書いていたような `level_by_level` がいいかもしれない ## step3(10分以内にさっとかける \* 3回) diff --git a/102-Binary-Tree-Level-Order-Traversal/step2.py b/102-Binary-Tree-Level-Order-Traversal/step2.py new file mode 100644 index 0000000..8270883 --- /dev/null +++ b/102-Binary-Tree-Level-Order-Traversal/step2.py @@ -0,0 +1,31 @@ +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + + +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> list[list[int]]: + if root is None: + return [] + + nodes: list[TreeNode] = [root] + values_by_level: list[list[int]] = [] + while nodes: + values: list[int] = [] + next_level: list[TreeNode] = [] + for node in nodes: + values.append(node.val) + if node.left is not None: + next_level.append(node.left) + if node.right is not None: + next_level.append(node.right) + + values_by_level.append(values) + nodes = next_level + + return values_by_level From 57dcf887de9e12a13a1872088aa2fee9bcb37296 Mon Sep 17 00:00:00 2001 From: Yota Maeda Date: Tue, 14 Jul 2026 22:04:42 +0900 Subject: [PATCH 3/3] step3 --- 102-Binary-Tree-Level-Order-Traversal/note.md | 2 ++ .../step3.py | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 102-Binary-Tree-Level-Order-Traversal/step3.py diff --git a/102-Binary-Tree-Level-Order-Traversal/note.md b/102-Binary-Tree-Level-Order-Traversal/note.md index d188c0f..1183e02 100644 --- a/102-Binary-Tree-Level-Order-Traversal/note.md +++ b/102-Binary-Tree-Level-Order-Traversal/note.md @@ -24,3 +24,5 @@ https://leetcode.com/problems/binary-tree-level-order-traversal/ - 変数名 traversal はちょっと変な気がするので、この方が使っている `values_by_level` とか他の方が書いていたような `level_by_level` がいいかもしれない ## step3(10分以内にさっとかける \* 3回) + +https://github.com/MA-yo-TA/leetcode/pull/22/changes#diff-dce60424cb6c268dbcb886bdef92379cfa43ce43bf656d9733daae9cc937f12dR71 で書いてあることと逆をやっているが、今回は values があるため、next_layer も含めてループ内の一時変数という感覚になった。まだ自分の好みが定まってないように感じる。 diff --git a/102-Binary-Tree-Level-Order-Traversal/step3.py b/102-Binary-Tree-Level-Order-Traversal/step3.py new file mode 100644 index 0000000..b3942a3 --- /dev/null +++ b/102-Binary-Tree-Level-Order-Traversal/step3.py @@ -0,0 +1,31 @@ +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + + +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> list[list[int]]: + if root is None: + return [] + + nodes = [root] + values_by_level = [] + while nodes: + values = [] + next_layer = [] + for node in nodes: + values.append(node.val) + if node.left is not None: + next_layer.append(node.left) + if node.right is not None: + next_layer.append(node.right) + + values_by_level.append(values) + nodes = next_layer + + return values_by_level