From e80b87ed1e101a75e70c006b08d92c7ffeaff845 Mon Sep 17 00:00:00 2001 From: Ayato Hayashi Date: Sun, 25 Feb 2024 16:00:57 +0900 Subject: [PATCH 1/5] Create 102. Binary Tree Level Order Traversal.md --- 102. Binary Tree Level Order Traversal.md | 115 ++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 102. Binary Tree Level Order Traversal.md diff --git a/102. Binary Tree Level Order Traversal.md b/102. Binary Tree Level Order Traversal.md new file mode 100644 index 0000000..2c93060 --- /dev/null +++ b/102. Binary Tree Level Order Traversal.md @@ -0,0 +1,115 @@ +BFSで解くのが自然。 + +1st + +BFS。`ans.append(values_of_this_level.copy())`は`copy`しなくても良いが、`copy`しておいた方が変更に強いかなと思いcopyした + +```python +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + if root is None: + return [] + nodes = [root] + ans = [] + while nodes: + values_of_this_level = [] + next_level = [] + for node in nodes: + values_of_this_level.append(node.val) + if node.left: + next_level.append(node.left) + if node.right: + next_level.append(node.right) + ans.append(values_of_this_level.copy()) + nodes = next_level + return ans +``` + +2nd + +1stの書き直し。 +```python +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + if root is None: + return [] + current_level = [root] + ans = [] + while current_level: + values = [] + next_level = [] + for node in current_level: + values.append(node.val) + if node.left: + next_level.append(node.left) + if node.right: + next_level.append(node.right) + ans.append(values.copy()) + current_level = next_level + return ans +``` + +Recursion +```python +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + def order_nodes_by_level(node, level): + if len(nodes_ordered_by_level) < level: + nodes_orderd_by_level.append([]) + nodes.prderd_by_level[level - 1].append(node.val) + if node.left: + order_nodes_by_level(node.left, level + 1) + if node.right: + order_nodes_by_level(node.right, level + 1) + + if root is None: + return [] + nodes_ordered_by_level = [] + order_nodes_by_level(root, 1) + return nodes_ordered_by_level +``` + +deque +```python +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + if root is None: + return [] + nodes = deque([(root, 1)]) + ans = [] + while nodes: + node, level = nodes.popleft() + if len(ans) < level: + ans.append([]) + ans[level - 1].append(node.val) + if node.left: + nodes.append((node.left, level + 1)) + if node.right: + nodes.append((node.right, level + 1)) + return ans +``` + +3rd + +だいたい1stと同じ。 + +```python +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + if root is None: + return [] + nodes = [root] + ans = [] + while nodes: + values = [] + next_nodes = [] + for node in nodes: + values.append(node.val) + if node.left: + next_nodes.append(node.left) + if node.right: + next_nodes.append(node.right) + ans.append(values) + nodes = next_nodes + return ans +``` From 39b4a15459b63bb502ffd77fc221ca66fe19c13c Mon Sep 17 00:00:00 2001 From: Ayato Hayashi Date: Sun, 25 Feb 2024 16:35:09 +0900 Subject: [PATCH 2/5] Update 102. Binary Tree Level Order Traversal.md --- 102. Binary Tree Level Order Traversal.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/102. Binary Tree Level Order Traversal.md b/102. Binary Tree Level Order Traversal.md index 2c93060..28b5dd7 100644 --- a/102. Binary Tree Level Order Traversal.md +++ b/102. Binary Tree Level Order Traversal.md @@ -55,13 +55,13 @@ class Solution: def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: def order_nodes_by_level(node, level): if len(nodes_ordered_by_level) < level: - nodes_orderd_by_level.append([]) - nodes.prderd_by_level[level - 1].append(node.val) + nodes_ordered_by_level.append([]) + nodes_ordered_by_level[level - 1].append(node.val) if node.left: order_nodes_by_level(node.left, level + 1) if node.right: order_nodes_by_level(node.right, level + 1) - + if root is None: return [] nodes_ordered_by_level = [] From 9655f0f82dcf16300c4f497abf7a63fdc419c401 Mon Sep 17 00:00:00 2001 From: Ayato Hayashi Date: Sun, 25 Feb 2024 23:42:21 +0900 Subject: [PATCH 3/5] Update 102. Binary Tree Level Order Traversal.md --- 102. Binary Tree Level Order Traversal.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/102. Binary Tree Level Order Traversal.md b/102. Binary Tree Level Order Traversal.md index 28b5dd7..3cfbc57 100644 --- a/102. Binary Tree Level Order Traversal.md +++ b/102. Binary Tree Level Order Traversal.md @@ -69,6 +69,15 @@ class Solution: return nodes_ordered_by_level ``` +> これ、一応 while にしておきます? +まあ、2つ以上深いのがいきなり呼ばれることはないわけですが。 + +> 私は、while だと思っていて、上から読んでいくと、 +「level が大きくて nodes_ordered_by_level が足りない場合、足りるように拡張します。そして、拡張した場所に書き込みます。」(読んでいくと、あとから、足りないことがあったとしても1段であることが他のところから分かる。) +「level が大きくて nodes_ordered_by_level が足りない場合、1段だけ拡張します。そして、level 番目に書き込みます。(書き込めなかったら IndexError が投げられます。)」(読んでいくと、1段だけしか拡張しなくても、level 番目が準備されているので例外はないことが分かる。) +というふうに読めます。どっちが読み手にとっていいですか。 +1段だけしか拡張しなくても例外が投げられることがないことに気がつくパズルを解かせる必要ないですよね。そうすると、下にするならば、コメント1行付けておいて、くらいの感覚です。 + deque ```python class Solution: From bdbc0495eb95ec2a10be1265e6a4e913648e3ea0 Mon Sep 17 00:00:00 2001 From: Ayato Hayashi Date: Wed, 28 Feb 2024 12:24:57 +0900 Subject: [PATCH 4/5] Update 102. Binary Tree Level Order Traversal.md --- 102. Binary Tree Level Order Traversal.md | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/102. Binary Tree Level Order Traversal.md b/102. Binary Tree Level Order Traversal.md index 3cfbc57..1990355 100644 --- a/102. Binary Tree Level Order Traversal.md +++ b/102. Binary Tree Level Order Traversal.md @@ -122,3 +122,49 @@ class Solution: nodes = next_nodes return ans ``` + +4th + +BFS, iterative +```python +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + if root is None: + return [] + nodes = [root] + orders = [] + while nodes: + values = [] + next_nodes = [] + for node in nodes: + values.append(node.val) + if node.left: + next_nodes.append(node.left) + if node.right: + next_nodes.append(node.right) + orders.append(values) + nodes = next_nodes + return orders +``` + +DFS preorder, recursion +```python +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + if root is None: + return [] + + def traverse_nodes_by_level(node, level): + if node is None: + return + # DFSのpreorderで2つ飛ばしで深くことはないのでifで良い + if len(orders) < level: + orders.append([]) + orders[level - 1].append(node.val) + traverse_nodes_by_level(node.left, level + 1) + traverse_nodes_by_level(node.right, level + 1) + + orders = [] + traverse_nodes_by_level(root, 1) + return orders +``` From 805c6610f6c9d5e6d2a61d1347c0174527904401 Mon Sep 17 00:00:00 2001 From: Ayato Hayashi Date: Thu, 2 May 2024 19:54:55 +0900 Subject: [PATCH 5/5] Update 102. Binary Tree Level Order Traversal.md --- 102. Binary Tree Level Order Traversal.md | 24 +++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/102. Binary Tree Level Order Traversal.md b/102. Binary Tree Level Order Traversal.md index 1990355..567bc32 100644 --- a/102. Binary Tree Level Order Traversal.md +++ b/102. Binary Tree Level Order Traversal.md @@ -168,3 +168,27 @@ class Solution: traverse_nodes_by_level(root, 1) return orders ``` + +5th + +命名とかは若干違うかほぼ同じ。 +```python +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + if root is None: + return [] + nodes = [root] + level_ordered_nodes = [] + while nodes: + next_nodes = [] + current_level_values = [] + for node in nodes: + current_level_values.append(node.val) + if node.left: + next_nodes.append(node.left) + if node.right: + next_nodes.append(node.right) + level_ordered_nodes.append(current_level_values) + nodes = next_nodes + return level_ordered_nodes +```