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
9 changes: 9 additions & 0 deletions 103/memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# 103. Binary Tree Zigzag Level Order Traversal
- [リンク](https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/description/)
- https://github.com/mamo3gr/arai60/blob/103_binary-tree-zigzag-level-order-traversal/103_binary-tree-zigzag-level-order-traversal/memo.md
- リストを「逆順」に扱う方法(用途で選ぶ)
- `xs.reverse()`:破壊的(in-place)。リスト自体を反転して良いなら最有力
- `reversed(xs)`:非破壊の逆順イテレータ。`for` で回すだけならこれが軽い(コピー不要)
- `list(reversed(xs))` / `xs[::-1]`:**非破壊**で「反転した新しいリスト」が欲しいとき(どちらも \(O(n)\) コピー)
- 手動で `for i in range(len(xs)-1, -1, -1)`:特殊な制御が必要なときだけ(可読性は落ちがち)
- 勉強のためにdfs+再帰も書く
32 changes: 32 additions & 0 deletions 103/sol1_dfs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from typing import Optional, List


# 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]]:
levels: List[List[int]] = []

def traverse(node: Optional[TreeNode], depth: int) -> None:
if node is None:
return

while len(levels) <= depth:
levels.append([])

if depth % 2 == 0:
levels[depth].append(node.val)
else:
levels[depth].insert(0, node.val)

traverse(node.left, depth + 1)
traverse(node.right, depth + 1)

traverse(root, 0)
return levels
32 changes: 32 additions & 0 deletions 103/sol2_dfs_recursion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from typing import Optional, List


# 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) -> List[List[int]]:
zigzag_level_order = []

def traverse(node, depth: int):
if node is None:
return

while len(zigzag_level_order) <= depth:
zigzag_level_order.append([])

if depth % 2 == 0:
zigzag_level_order[depth].append(node.val)
else:
zigzag_level_order[depth].insert(0, node.val)

traverse(node.left, depth + 1)
traverse(node.right, depth + 1)

traverse(root, 0)
return zigzag_level_order