diff --git a/problems/103.binary-tree-zigzag-level-order-traversal/memo.md b/problems/103.binary-tree-zigzag-level-order-traversal/memo.md new file mode 100644 index 0000000..ef0b229 --- /dev/null +++ b/problems/103.binary-tree-zigzag-level-order-traversal/memo.md @@ -0,0 +1,22 @@ +## step1 +- 102の解き方をする際に工夫をすれば良さそう + - 1. nodeのたどり方を変えるパターン + - 2. nodeの値を追加する際に追加の順番を変えるパターン + - 3. 出力時に必要があれば反転させるパターン +- 2が一番簡単そう +- 5分ほどですんなりかけた +- データが増えたときにdequeをlistに変換する部分が重たくならないか気になった + +## step2 +- 他の人のコードを見る +- https://github.com/mamo3gr/arai60/pull/27 + - `next_levelよりはnext_nodesかnext_level_nodesなどの方が自然に感じます`確かに。自分にも当てはまるのでnodeをつけるようにしたい + - 現在のlevelの偶奇を毎回計算するパターンで記述してあるが、自分の場合は1loopで反転させている。どちらが良いかを考えたが、1loopで次のlevelに行くのは自明ではあるが元々のルールでは階層ごとに順番を変えるというものなのでlevelから判断する方が後から見た時に考えるstepが1つ減らせるので良さそうに思った +- https://github.com/naoto-iwase/leetcode/pull/31 + - `list にしているので結果的にコピーされていますよね……。私は直感的にはこちらのほうが遅い気がします。(どうせそんなに問題になるレベルではないですが。)`やはりdeque=>listの変換時にO(N)の計算量になっているので遅い。dequeを使う意味合いが薄れるので再度に反転の必要がある場合にreverseやreversedを使っても問題なさそう +- https://github.com/nanae772/leetcode-arai60/pull/27 + - `個人的にはrootをはじめとして降りるごとに反転していった結果、反転するのがlevelが奇数である時に合致した、という印象を持っています。つまりlevelの偶奇で判断するのは要件から離れていると感じるので、levelが上がるにつれてis_left_to_rightのbool値を反転させていく方が好みです。`先ほど考えた偶奇を毎回反転させるか階層から判断するかというところが議論されていて私の考えた結果と逆の方がいらっしゃった + +## step3 +- すんなり書けた + diff --git a/problems/103.binary-tree-zigzag-level-order-traversal/step1.py b/problems/103.binary-tree-zigzag-level-order-traversal/step1.py new file mode 100644 index 0000000..ac57ab2 --- /dev/null +++ b/problems/103.binary-tree-zigzag-level-order-traversal/step1.py @@ -0,0 +1,46 @@ +# +# @lc app=leetcode id=103 lang=python3 +# +# [103] Binary Tree Zigzag Level Order Traversal +# + +# @lc code=start +# 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 +import collections + + +class Solution: + def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + zigzag_level_order_values = [] + if root is None: + return zigzag_level_order_values + + current_level = [root] + is_odd_level = False + + while current_level: + current_values = collections.deque() + next_level = [] + for current in current_level: + if is_odd_level: + current_values.appendleft(current.val) + else: + current_values.append(current.val) + if current.left: + next_level.append(current.left) + if current.right: + next_level.append(current.right) + + zigzag_level_order_values.append(list(current_values)) + current_level = next_level + is_odd_level = not is_odd_level + + return zigzag_level_order_values + + +# @lc code=end diff --git a/problems/103.binary-tree-zigzag-level-order-traversal/step2.py b/problems/103.binary-tree-zigzag-level-order-traversal/step2.py new file mode 100644 index 0000000..af45846 --- /dev/null +++ b/problems/103.binary-tree-zigzag-level-order-traversal/step2.py @@ -0,0 +1,42 @@ +# +# @lc app=leetcode id=103 lang=python3 +# +# [103] Binary Tree Zigzag Level Order Traversal +# + +# @lc code=start +# 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 zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + zigzag_level_order_values = [] + if root is None: + return zigzag_level_order_values + + current_level_nodes = [root] + level = 0 + + while current_level_nodes: + current_level_values = [] + next_level_nodes = [] + for current in current_level_nodes: + current_level_values.append(current.val) + if current.left: + next_level_nodes.append(current.left) + if current.right: + next_level_nodes.append(current.right) + + if level % 2: + current_level_values.reverse() + zigzag_level_order_values.append(current_level_values) + current_level_nodes = next_level_nodes + level += 1 + + return zigzag_level_order_values + + +# @lc code=end diff --git a/problems/103.binary-tree-zigzag-level-order-traversal/step3.py b/problems/103.binary-tree-zigzag-level-order-traversal/step3.py new file mode 100644 index 0000000..af45846 --- /dev/null +++ b/problems/103.binary-tree-zigzag-level-order-traversal/step3.py @@ -0,0 +1,42 @@ +# +# @lc app=leetcode id=103 lang=python3 +# +# [103] Binary Tree Zigzag Level Order Traversal +# + +# @lc code=start +# 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 zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + zigzag_level_order_values = [] + if root is None: + return zigzag_level_order_values + + current_level_nodes = [root] + level = 0 + + while current_level_nodes: + current_level_values = [] + next_level_nodes = [] + for current in current_level_nodes: + current_level_values.append(current.val) + if current.left: + next_level_nodes.append(current.left) + if current.right: + next_level_nodes.append(current.right) + + if level % 2: + current_level_values.reverse() + zigzag_level_order_values.append(current_level_values) + current_level_nodes = next_level_nodes + level += 1 + + return zigzag_level_order_values + + +# @lc code=end