diff --git a/103/memo.md b/103/memo.md new file mode 100644 index 0000000..9a4e0c6 --- /dev/null +++ b/103/memo.md @@ -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+再帰も書く diff --git a/103/sol1_dfs.py b/103/sol1_dfs.py new file mode 100644 index 0000000..fcdba82 --- /dev/null +++ b/103/sol1_dfs.py @@ -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 diff --git a/103/sol2_dfs_recursion.py b/103/sol2_dfs_recursion.py new file mode 100644 index 0000000..d1cdebb --- /dev/null +++ b/103/sol2_dfs_recursion.py @@ -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