Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions binary_tree_level_order_traversal/phase1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Definition for a binary tree node.
# 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]]:
level_traversed_node_ids = []
def append_by_depth(node: Optional[TreeNode], depth: int):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

自分ならids -> valsdepth -> levelを使うと思います。
表現にバリエーションが出てしまうと、後々混乱の原因になるかもと思いました。

if not node:
return
if len(level_traversed_node_ids) == depth:
level_traversed_node_ids.append([])

level_traversed_node_ids[depth].append(node.val)
append_by_depth(node.left, depth + 1)
append_by_depth(node.right, depth + 1)

append_by_depth(root, 0)
return level_traversed_node_ids
32 changes: 32 additions & 0 deletions binary_tree_level_order_traversal/phase2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# レベルごとの捜査なのでBFSが適しているというコメントがあり, そりゃそうだわの気持ちになり反省
# 再帰で書く変な先入観みたいなのがついている気がしたので今一度なんで書くのかをしっかりと...
# seal-azarashi: https://github.com/seal-azarashi/leetcode/pull/25/files
# goto-untrapped: https://github.com/goto-untrapped/Arai60/pull/50/files
# Ryotaro25: https://github.com/Ryotaro25/leetcode_first60/pull/28/files
# BFSで解くこと, 一つの変数に二つの役割を持たさないように注意して再度実行

# Definition for a binary tree node.
# 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]]:
level_to_nodes = []

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちら、階層ごとの値が入っているというよりは、階層とそれに紐づく node が入っているように見えました。level_order_valsall_level_vals が浮かびました。

current_level_nodes = [root]
while current_level_nodes:
next_level_nodes = []
node_ids = []

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

問題文の単語に合わせて、node_vals としてもよいように感じました。他の単語に合わせて current_level_vals とかでもよいかもしれません。

for node in current_level_nodes:
if not node:
continue
node_ids.append(node.val)
next_level_nodes.append(node.left)
next_level_nodes.append(node.right)

current_level_nodes = next_level_nodes
if len(node_ids) > 0:
level_to_nodes.append(node_ids)

return level_to_nodes
24 changes: 24 additions & 0 deletions binary_tree_level_order_traversal/phase3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Definition for a binary tree node.
# 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]]:
level_to_nodes = []
current_level_nodes = [root]
while current_level_nodes:
node_ids = []
next_level_nodes = []
for node in current_level_nodes:
if not node:
continue
node_ids.append(node.val)
next_level_nodes.append(node.left)
next_level_nodes.append(node.right)
current_level_nodes = next_level_nodes
if len(node_ids) > 0:
level_to_nodes.append(node_ids)
Comment on lines +21 to +22
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

単に if node_ids: でもいいでしょう。
個人的には current_level_nodes = next_level_nodes の前に置きたいです。

current_level_nodes に None が入っているので、これいるんですね。よしあしですが、入るかもしれない前提で書いたほうが単純かもしれません。


return level_to_nodes