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
22 changes: 22 additions & 0 deletions problems/103.binary-tree-zigzag-level-order-traversal/memo.md
Original file line number Diff line number Diff line change
@@ -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
- すんなり書けた

46 changes: 46 additions & 0 deletions problems/103.binary-tree-zigzag-level-order-traversal/step1.py
Original file line number Diff line number Diff line change
@@ -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
42 changes: 42 additions & 0 deletions problems/103.binary-tree-zigzag-level-order-traversal/step2.py
Original file line number Diff line number Diff line change
@@ -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
42 changes: 42 additions & 0 deletions problems/103.binary-tree-zigzag-level-order-traversal/step3.py
Original file line number Diff line number Diff line change
@@ -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