diff --git a/.gitignore b/.gitignore index cde7748..3ed341f 100644 --- a/.gitignore +++ b/.gitignore @@ -104,3 +104,4 @@ node_modules/ package-lock.json .claude/skills +prompt diff --git a/Algorithm/BinaryTree/leetcode/111. Minimum Depth of Binary Tree/claude sonnet 4.6 adaptive/Minimum_Depth_of_Binary_Tree_Python.md b/Algorithm/BinaryTree/leetcode/111. Minimum Depth of Binary Tree/claude sonnet 4.6 adaptive/Minimum_Depth_of_Binary_Tree_Python.md new file mode 100644 index 0000000..19796f5 --- /dev/null +++ b/Algorithm/BinaryTree/leetcode/111. Minimum Depth of Binary Tree/claude sonnet 4.6 adaptive/Minimum_Depth_of_Binary_Tree_Python.md @@ -0,0 +1,348 @@ +> ð¯ **[algo-beginner ã¹ãã«çºç«]** +> èšèª/ã«ããŽãª: Python (CPython 3.11.10) +> é©çšã«ãŒã«ã»ãã: å ±é5ã«ãŒã« + Pythonåºæã«ãŒã« +> åç §ãã¡ã€ã«: references/common.md + references/python.md + +--- + +# ð³ Minimum Depth of Binary Tree â Python å®å šè§£èª¬ + +--- + +## 1. åé¡åæçµæ + +> ð¡ **äžèšã§èšããš**ïŒãæšã®æ ¹ããæãè¿ã"æ«ç«¯ããŒãïŒèïŒ"ãŸã§ã®ãæçã®éã®ãïŒããŒãæ°ïŒãæ±ããåé¡ãã§ãã + +### â ïž Python/CPython ç¹æã®æ³šæç¹ïŒæåã«ç¢ºèªïŒ + +BFSïŒå¹ åªå æ¢çŽ¢ïŒã®å®è£ ã§ã¯ãPythonæšæºãªã¹ã `list` ã® `pop(0)` ã䜿ããããªããŸããã**ãªã¹ãã®å é åé€ã¯ O(n) ã®ã³ã¹ã**ãããããŸãïŒå šèŠçŽ ã1ã€ãã€å·Šã«ãããããïŒã代ããã« `collections.deque`ïŒããã¯ïŒã® `popleft()` ã䜿ãããšã§ O(1) ã«æ¹åã§ããŸããããŒãæ°ãæå€§ `10^5` ã®å Žåããã®å·®ã¯ç¡èŠã§ããŸããããŸããååž°ïŒDFSïŒã䜿ãå Žå㯠Python ã®ããã©ã«ãå垰深床å¶éïŒ`sys.getrecursionlimit()` = 1000ïŒã«æ³šæãå¿ èŠã§ãã + +--- + +### ç«¶æããã°ã©ãã³ã°èŠç¹ + +- **å¶çŽåæ**ïŒããŒãæ°ã¯æå€§ `10^5`ãO(n) ã®ã¢ã«ãŽãªãºã ã§åå +- **æéææ³**ïŒBFS ã§æåã®èãèŠã€ããç¬éã«å³ `return`ïŒæ©æçµäºïŒ +- **ã¡ã¢ãªæå°å**ïŒ`deque` ã䜿ããã¥ãŒã®ãµã€ãºãæšã®å¹ ã«æãã +- **CPythonæé©å**ïŒ`collections.deque` 㯠C å®è£ ã`popleft()` ã O(1) ã§ãªã¹ãããå€§å¹ ã«éã + +### æ¥åéçºèŠç¹ + +- **åå®å šèšèš**ïŒ`Optional[TreeNode]` ãæ£ãã䜿ããpylance ãšã©ãŒãåºãªãããã«ãã +- **ãšã©ãŒãã³ããªã³ã°**ïŒ`root` ã `None` ã®ã±ãŒã¹ïŒç©ºã®æšïŒãå ã«åŠçãã +- **å¯èªæ§**ïŒBFS ã®ããªãããæžããããã³ã¡ã³ãã§æç€ºãã + +### Pythonç¹æåæ + +| èŠ³ç¹ | æ¡çš | çç± | +| ----------------------- | -------------- | ------------------------------------------ | +| `collections.deque` | â | `popleft()` ã O(1)ã`list.pop(0)` 㯠O(n) | +| ååž°ïŒDFSïŒ | åèãšããŠæç€º | æ·±ãæšã§ååž°å¶éãªã¹ã¯ãã | +| `sys.setrecursionlimit` | ç«¶æçã§èæ ® | ããã©ã«ã1000ãè¶ ããæšã«å¯Ÿå¿ | + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **CPython**ïŒæãåºã䜿ãããPythonã®å®è£ ãCèšèªã§æžãããŠããã`deque`ãªã©ã®çµã¿èŸŒã¿ããŒã¿æ§é ãCå®è£ ã®ããé«é +> - **O(n)**ïŒããŒãæ°ã2åã«ãªããšåŠçãçŽ2åã«ãªãããš +> - **GIL**ïŒPythonã¹ã¬ãããåæã«å®è¡ãããªãããã«ããããã¯æ©æ§ãä»åã¯ã·ã³ã°ã«ã¹ã¬ãããªã®ã§åœ±é¿ãªã +> - **å垰深床å¶é**ïŒPythonãååž°åŒã³åºããèš±å¯ããæå€§åæ°ãããã©ã«ãã¯1000å + +--- + +## 2. æ¡çšã¢ã«ãŽãªãºã ãšæ ¹æ + +> ð¡ åãåé¡ã§ãè§£ãæ¹ã¯è€æ°ãããŸãããéãããã¡ã¢ãªããPythonãšã®çžæ§ãã®3è»žã§æ¯ã¹ãŠæé©ãªãã®ãéžã³ãŸãã + +| ã¢ãããŒã | æéèšç®é | 空éèšç®é | Pythonå®è£ ã³ã¹ã | å¯èªæ§ | æšæºã©ã€ãã©ãªæŽ»çš | CPythonæé©å | åè | +| ----------------- | ---------- | ---------- | ---------------- | ------ | ---------------------------- | ---------------- | ------------------------ | +| **BFSïŒdequeïŒ** | O(n) | O(w)â»1 | äœ | â â â | `collections.deque`ïŒCå®è£ ïŒ | â é© | **æ¡çš**ïŒæ©æçµäºã§æé | +| DFS ååž° | O(n) | O(h)â»2 | æäœ | â â â | ãªã | â³ æ·±ãæšã§ãªã¹ã¯ | ååž°å¶éã«æ³šæ | +| DFS å埩ïŒstackïŒ | O(n) | O(h) | äœ | â â â | `list`ïŒã¹ã¿ãã¯ä»£çšïŒ | â³ | å šèã確èªãå¿ èŠ | + +â»1 `w` = æšã®æå€§å¹ ïŒå®å šäºåæšã§ã¯ O(n/2)ïŒ +â»2 `h` = æšã®é«ãïŒææª O(n)ãå¹³å O(log n)ïŒ + +**éžæçç±**ïŒãæçæ·±ãããæ±ããåé¡ã§ã¯ **BFS ãèªç¶ã«æé©**ã§ããBFS ã¯æµ ãå±€ããé ã«æ¢çŽ¢ãããããæåã«èãèŠã€ããç¬éã«ããã確å®ã«æçè·é¢ã§ããDFSïŒååž°ïŒã¯å šèã確èªããŠããæ¯èŒãããããBFS ã®æ©æçµäºã®æ©æµããããŸãããããã« `collections.deque` 㯠C å®è£ ãªã®ã§ãPure Python ã®ãªã¹ããã `popleft()` ãå€§å¹ ã«é«éã§ãã + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **BFSïŒå¹ åªå æ¢çŽ¢ïŒ**ïŒæšããæµ ãé ã»æšªã«åºããé ãã«æ¢çŽ¢ããæ¹æ³ããã¥ãŒïŒFIFOïŒã䜿ã +> - **DFSïŒæ·±ãåªå æ¢çŽ¢ïŒ**ïŒæšããæ ¹ããèãŸã§äžæ¬éã«æ·±ãæœããæ¹æ³ãååž°ãŸãã¯ã¹ã¿ãã¯ã䜿ã +> - **collections.deque**ïŒåãããåŸãããã O(1) ã§åºãå ¥ãã§ããã䞡端éãã®ç®±ããCå®è£ ã®ãã`list`ããé«é +> - **æ©æçµäº**ïŒçãã確å®ããç¬éã«ã«ãŒããæããããšãäžèŠãªåŠçãã¹ãããããŠé«éåã§ãã + +--- + +## 3. å®è£ ãã¿ãŒã³ + +> ð¡ **ã³ãŒãã®å€§ãŸããªéªšæ Œ** +> +> 1. `root` ã `None`ïŒç©ºã®æšïŒãªãå³ `0` ãè¿ã +> 2. `deque` ã«ã«ãŒãããŒããšæ·±ã `1` ãå ¥ããŠBFSéå§ +> 3. ãã¥ãŒããåãåºã â èãªãå³ `return`ãåãããã°ãã¥ãŒã«è¿œå +> 4. ïŒå°éããªããïŒå šæ¢çŽ¢åŸã®ãã©ãŒã«ãã㯠+ +--- + +### ãæ¥åéçºçã䜿ãå Žé¢ã + +ããŒã ã§é·æéã¡ã³ããã³ã¹ãããããã¯ã·ã§ã³ã³ãŒãã«åããŸããåãã³ããš `pylance` 察å¿ãdocstringãå ¥åæ€èšŒãå®åããŠãããã³ãŒããåããŠèªã人ã§ãæå³ãçè§£ããããæ§é ã«ãªã£ãŠããŸãã + +```python +from typing import Optional +from collections import deque + + +# LeetCodeãæäŸããTreeNodeã¯ã©ã¹ïŒå®çŸ©æžã¿ãªã®ã§å®éã«ã¯äžèŠïŒ +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right + + +class Solution: + def minDepth(self, root: Optional[TreeNode]) -> int: + """ + äºåæšã®æå°æ·±ãïŒæ ¹ããæãè¿ãèãŸã§ã®ããŒãæ°ïŒãè¿ãã + + ã¢ã«ãŽãªãºã : BFSïŒå¹ åªå æ¢çŽ¢ïŒ + - deque ã䜿ããã¥ãŒã O(1) ã§æäœãã + - æåã«èãèŠã€ããæç¹ã§å³ returnïŒæ©æçµäºïŒ + + Args: + root: äºåæšã®æ ¹ããŒããNone ã®å Žåã¯ç©ºã®æšãæå³ãã + + Returns: + æå°æ·±ãïŒæŽæ°ïŒãç©ºã®æšã®å Žå㯠0ã + + Raises: + ç¹ã«äŸå€ã¯çºçããªãïŒNone ã¯æ£åžžå ¥åãšããŠåŠçããïŒ + + Time Complexity: O(n) â ææªã±ãŒã¹ã§å šããŒãã1åãã€åŠç + Space Complexity: O(w) â w ã¯æšã®æå€§å¹ ïŒãã¥ãŒã«åæã«å ¥ãæå€§ããŒãæ°ïŒ + """ + + # ââââââââââââââââââââââââââââââââââââââââ + # ãšããžã±ãŒã¹: ç©ºã®æšïŒroot ã NoneïŒ + # æ ¹ããªããã°ãèãŸã§ã®éãèªäœãååšããªããã 0 ãè¿ã + # ââââââââââââââââââââââââââââââââââââââââ + if root is None: + return 0 + + # ââââââââââââââââââââââââââââââââââââââââ + # BFS çšãã¥ãŒãåæåãã + # deque ã䜿ãçç±ïŒ + # list ã® popleft() 㯠O(n)ïŒå šèŠçŽ ãå·Šã«ãããã³ã¹ããçºçããïŒ + # deque ã® popleft() 㯠O(1)ïŒãã€ã³ã¿ãåããã ãã§å®çµããïŒ + # ã¿ãã« (ããŒã, çŸåšã®æ·±ã) ã§ãã¢ã管çããæ·±ããå€éšå€æ°ã§æããã«æžãŸãã + # ââââââââââââââââââââââââââââââââââââââââ + queue: deque[tuple[TreeNode, int]] = deque() + queue.append((root, 1)) # æ ¹ããŒãã¯æ·±ã1ããã¹ã¿ãŒã + + # ââââââââââââââââââââââââââââââââââââââââ + # ãã¥ãŒã空ã«ãªããŸã§BFSãç¶ãã + # ââââââââââââââââââââââââââââââââââââââââ + while queue: + + # ãã¥ãŒã®å é ããããŒããšæ·±ããåãåºã + # popleft() ã§ FIFOïŒå å ¥ãå åºãïŒãå®çŸ â æµ ãé ã«åŠçããã + node, depth = queue.popleft() + + # ââââââââââââââââââââââââââââââââââââ + # èããŒãå€å®: å·Šãå³ãåããªã = è + # BFS ã¯æµ ãé ã«åŠçãããããæåã«èŠã€ãã£ãèã + # å¿ ãæå°æ·±ããæã€ â å³ return ã§ãã + # ââââââââââââââââââââââââââââââââââââ + if node.left is None and node.right is None: + return depth # ð¯ æå°æ·±ãç¢ºå® + + # å·Šã®åãååšããå Žåã®ã¿ãã¥ãŒã«è¿œå + # None ã®åã远å ãããšåŸã§ NullPointerError çžåœã®ãã°ã«ãªããã + # ããã§å¿ ããã§ãã¯ãã + if node.left is not None: + queue.append((node.left, depth + 1)) + + # å³ã®åãååšããå Žåã®ã¿ãã¥ãŒã«è¿œå ïŒå·Šãšåæ§ã®çç±ïŒ + if node.right is not None: + queue.append((node.right, depth + 1)) + + # ââââââââââââââââââââââââââââââââââââââââ + # ããã«ã¯éåžžå°éããªã + # root ã None ã§ãªãæå¹ãªæšãªãå¿ ãèãååšãããã + # pylance ã«ãint ãè¿ããããšãä¿èšŒããããã®ãã©ãŒã«ãã㯠+ # ââââââââââââââââââââââââââââââââââââââââ + return 0 +``` + +--- + +### åäœãã¬ãŒã¹ïŒæ¥åéçºçïŒ + +#### Example 1: `root = [3,9,20,null,null,15,7]` + +``` + 3 + / \ + 9 20 + / \ + 15 7 + +åæç¶æ : + queue = deque([ (Node(3), 1) ]) + +âââ ã«ãŒã1åç® âââ + popleft() â (Node(3), depth=1) + Node(3).left = Node(9) â null ã§ãªã + Node(3).right = Node(20) â null ã§ãªã + â èã§ãªãïŒäž¡æ¹ã«åãããïŒ + queue ã«è¿œå : (Node(9), 2), (Node(20), 2) + queue = deque([ (Node(9),2), (Node(20),2) ]) + +âââ ã«ãŒã2åç® âââ + popleft() â (Node(9), depth=2) + Node(9).left = None + Node(9).right = None + â ð¯ äž¡æ¹ None = èããŒãïŒ return 2 + +Answer: 2 â +``` + +#### Example 2: `root = [2,null,3,null,4,null,5,null,6]`ïŒâ ïž çœ ããïŒ + +``` + 2 + \ + 3 + \ + 4 + \ + 5 + \ + 6 â å¯äžã®è + +âââ ã«ãŒã1åç® âââ + popleft() â (Node(2), depth=1) + Node(2).left = None â None ã ã... + Node(2).right = Node(3) â å³ã®åãããïŒ + â â ïž çœ ïŒleft ã None ã§ã right ãããã®ã§èã§ã¯ãªã + â left ã¯è¿œå ããªããright ã ã远å + queue = deque([ (Node(3), 2) ]) + +âââ ã«ãŒã2ã5åç®ïŒåæ§ã«ç¹°ãè¿ãïŒâââ + Node(3) â right=Node(4) â èã§ãªããæ·±ã3远å + Node(4) â right=Node(5) â èã§ãªããæ·±ã4远å + Node(5) â right=Node(6) â èã§ãªããæ·±ã5远å + +âââ ã«ãŒã6åç® âââ + popleft() â (Node(6), depth=5) + Node(6).left = None + Node(6).right = None + â ð¯ èããŒãçºèŠïŒ return 5 + +Answer: 5 â +``` + +--- + +### ãç«¶æããã°ã©ãã³ã°çã䜿ãå Žé¢ã + +LeetCodeã»AtCoder ãªã©å¶éæéå ã«æ£è§£ãåºãããšãç®çã®ã³ãŒãã«åããŸããåãã³ãã docstring ã¯æå°éã«ããã³ãŒãã®çããšå®è¡é床ãåªå ããæžãæ¹ã«ãªã£ãŠããŸãã + +```python +from typing import Optional +from collections import deque + + +class Solution: + def minDepth(self, root: Optional[TreeNode]) -> int: + # ç©ºã®æšã¯æ·±ã0 + if not root: + return 0 + + # deque ã§ãã¥ãŒãåæåïŒpopleft ã O(1) ã®ãã list ããé«éïŒ + q: deque[tuple[TreeNode, int]] = deque([(root, 1)]) + + while q: + node, d = q.popleft() + + # èããŒãçºèŠ â å³ returnïŒBFS ãªã®ã§ãããæå°æ·±ãïŒ + if not node.left and not node.right: + return d + + # åã远å ïŒNone ã¯è¿œå ããªãïŒ + if node.left: + q.append((node.left, d + 1)) + if node.right: + q.append((node.right, d + 1)) + + return 0 # pylance çšãã©ãŒã«ããã¯ïŒå®éã«ã¯å°éããªãïŒ +``` + +--- + +### åèïŒDFS ååž°çïŒå¯èªæ§æé«ã»ç«¶æåãïŒ + +> **DFS ååž°çã䜿ãéã®æ³šæ**ïŒPython ã®ããã©ã«ãå垰深床㯠`1000` ã§ããçŽç·ç¶ã®æšïŒäŸ2ã®ãããªæšïŒã§ããŒãæ°ã 1000 ãè¶ ãããš `RecursionError` ãçºçããŸããLeetCode ã§ã¯å¶çŽäžããŒãæ°ãæå€§ `10^5` ãªã®ã§ã**ç«¶æçã§ãBFSæšå¥š**ã§ããåèãšããŠç€ºããŸãã + +```python +from typing import Optional + + +class Solution: + def minDepth(self, root: Optional[TreeNode]) -> int: + # ããŒã¹ã±ãŒã¹: æšã空ãªãæ·±ã0 + if root is None: + return 0 + + # ââââââââââââââââââââââââââââââââââââââââ + # éèŠãªçœ ïŒçæ¹ã None ã®ããŒãã¯èã§ã¯ãªã + # å·Šã None â å·Šæ¹åã«èã¯ãªã â å³ã ãååž°ãã + # ââââââââââââââââââââââââââââââââââââââââ + if root.left is None: + # å·Šã®åããªãã®ã§å³æ¹åã®ã¿æ¢çŽ¢ããèªåèªèº«ã®å(+1)ãè¶³ã + return 1 + self.minDepth(root.right) + + if root.right is None: + # å³ã®åããªãã®ã§å·Šæ¹åã®ã¿æ¢çŽ¢ããèªåèªèº«ã®å(+1)ãè¶³ã + return 1 + self.minDepth(root.left) + + # äž¡æ¹ã®åãååšããå Žå: äž¡æ¹æ¢çŽ¢ããŠå°ããæ¹ + èªåèªèº«ã®1 + return 1 + min(self.minDepth(root.left), self.minDepth(root.right)) +``` + +--- + +## 4. æ€èšŒ + +> ð¡ ãšããžã±ãŒã¹ã®ãã¹ãã¯ãã¢ã«ãŽãªãºã ãããµã€ãã®å ¥åãã ãã§ãªããæ¥µç«¯ãªå ¥åãã§ãæ£ããåããã確ãããããã®ãã®ã§ãã + +| ã±ãŒã¹ | å ¥å | æåŸ å€ | çç± | +| ------------------- | ------------------------- | ------ | ----------------------- | +| ç©ºã®æš | `root = None` | `0` | æ ¹ããªããã°èããªã | +| æ ¹ã®ã¿ïŒããŒã1ã€ïŒ | `root = [1]` | `1` | æ ¹èªäœãè | +| å·Šåãæš | `[1, 2, null, 3]` | `3` | å³ããªãã®ã§å·Šã®ã¿ | +| å³åãæšïŒçŽç·ïŒ | `[2,null,3,null,4]` | `3` | å šããŒããäžçŽç· | +| å®å šäºåæš | `[3,9,20,null,null,15,7]` | `2` | æ·±ã2ã®èãæç | +| æå€§å¶çŽ | ããŒãæ° `10^5` | â | TLEã»MLE ãèµ·ããªãããš | + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **ãšããžã±ãŒã¹**ïŒç©ºã®ããªãŒã»ããŒã1ã€ã»çŽç·ç¶ã®æšãªã©ãå¢ççãªæ¡ä»¶ã®ããš +> - **RecursionError**ïŒååž°ã®åŒã³åºãåæ°ã `sys.getrecursionlimit()`ïŒããã©ã«ã1000ïŒãè¶ ãããšãã«çºçãããšã©ãŒ +> - **TLEïŒTime Limit ExceededïŒ**ïŒå¶éæéè¶ éãèšç®éã倧ãããããšçºçãã +> - **MLEïŒMemory Limit ExceededïŒ**ïŒã¡ã¢ãªå¶éè¶ éã倧ããªããŒã¿æ§é ãæã¡ããããšçºçãã +> - **ãã©ãŒã«ããã¯**ïŒãæ¬æ¥ã¯å°éããªãã念ã®ããæžããŠããåŠçããpylance ã®åãã§ãã¯ãéãããã«ãå¿ èŠ + +--- + +## ãŸãšã + +| èŠ³ç¹ | å 容 | +| --------------------- | ------------------------------------------------------------------------ | +| **åé¡ã®æ¬è³ª** | æ ¹ããæãè¿ãèãŸã§ã®æçããŒãæ° | +| **æå€§ã®çœ ** | çæ¹ã®åã `None` ã®ããŒãã¯ãèãã§ã¯ãªã | +| **æ¡çšææ³** | BFSïŒ`collections.deque` ã§ O(1) popleftïŒ | +| **æéèšç®é** | O(n)ïŒææªã±ãŒã¹ã§å šããŒãæ¢çŽ¢ | +| **空éèšç®é** | O(w)ïŒãã¥ãŒã®æå€§ãµã€ãºã¯æšã®æå€§å¹ | +| **Python ã®ãã€ã³ã** | `list.pop(0)` ã§ã¯ãªã `deque.popleft()` ã䜿ãããšã§ O(n) â O(1) ã«æ¹å | diff --git a/Algorithm/BinaryTree/leetcode/111. Minimum Depth of Binary Tree/claude sonnet 4.6 adaptive/Minimum_Depth_of_Binary_Tree_Typescript.md b/Algorithm/BinaryTree/leetcode/111. Minimum Depth of Binary Tree/claude sonnet 4.6 adaptive/Minimum_Depth_of_Binary_Tree_Typescript.md new file mode 100644 index 0000000..309204b --- /dev/null +++ b/Algorithm/BinaryTree/leetcode/111. Minimum Depth of Binary Tree/claude sonnet 4.6 adaptive/Minimum_Depth_of_Binary_Tree_Typescript.md @@ -0,0 +1,387 @@ +> ð¯ **[algo-beginner ã¹ãã«çºç«]** +> èšèª/ã«ããŽãª: TypeScript +> é©çšã«ãŒã«ã»ãã: å ±é5ã«ãŒã« + TSåºæ5ã«ãŒã« +> åç §ãã¡ã€ã«: references/common.md + references/typescript.md + +--- + +# ð³ Minimum Depth of Binary Tree â å®å šè§£èª¬ + +--- + +## 1. åé¡ã®åæ + +> ð¡ **ãã®åé¡ãäžèšã§èšããš**ïŒãæšã®æ ¹ïŒrootïŒããèïŒleafïŒãŸã§ã®æçã®éã®ããæ±ããåé¡ãã§ãããã ã **é倧ãªçœ ** ããããŸãã + +--- + +### â ïž ååŠè ãå¿ ããããçœ ïŒãèããŒããã®å®çŸ© + +ãæçè·é¢ã ãã `Math.min(å·Šã®æ·±ã, å³ã®æ·±ã)` ã§ããã®ã§ã¯ïŒããšæããããããŸããããšããã**ããã¯ééãã§ã**ã + +**èããŒãïŒleaf nodeïŒãšã¯ãå·Šãå³ãåã©ããæããªãããŒãã**ã®ããšã§ããçæ¹ã ãåãããå Žåã¯ãèã§ã¯ãããŸããã + +``` +Example 2: root = [2,null,3,null,4,null,5,null,6] + + 2 + \ + 3 + \ + 4 + \ + 5 + \ + 6 â ãããå¯äžã®èããŒã +``` + +ããåçŽã« `Math.min(å·Š=0, å³=5)` = `0` ãè¿ããŠããŸããšã**å·Šã®åãããªãïŒdepth=0ïŒããèããšèª€è§£ãããŠçããééããŸã**ãå·Šã®åã `null` ã®ãšãã¯ããã®æ¹åã¯ç¡å¹ãšããŠç¡èŠãã峿¹åã ãã蟿ããªããã°ãªããŸããã + +--- + +### ç«¶æããã°ã©ãã³ã°èŠç¹ã§ã®åæ + +- **BFSïŒå¹ åªå æ¢çŽ¢ïŒ** ãæé©ãæ ¹ããå±€ïŒã¬ãã«ïŒããšã«æ¢çŽ¢ãã**æåã«èã«åœãã£ãç¬éã«å³çµäº**ã§ãããããæçã±ãŒã¹ã§éåžžã«é«é +- æ·±ãåã£ãæšïŒäŸ2ã®ãããªçŽç·ç¶ïŒã§ããDFSã¯å šããŒãèµ°ç Žãå¿ èŠã ããBFSãææªã±ãŒã¹ã§ã¯åæ§ã«ãªã +- ããŒãæ°ã®äžéã `10^5` ãªã®ã§ãO(n) ã§ããã°åå + +### æ¥åéçºèŠç¹ã§ã®åæ + +- åå®å šæ§ïŒ`TreeNode | null` ã® UnionåïŒ2ã€ã®å¯èœæ§ã `|` ã§è¡šãåïŒãæ£ããæ±ãããšãéèŠ +- ååž°çDFSã¯å®è£ ãçŽæçã§ä¿å®ããããããæ·±ãæšã§ã¹ã¿ãã¯ãªãŒããŒãããŒïŒïŒåŒã³åºãåæ°ãæ·±ããªããããŠã¡ã¢ãªã溢ããããšïŒã®ãªã¹ã¯ããã +- BFSã¯ãã¥ãŒïŒåŸ ã¡è¡åïŒã䜿ããããã¡ã¢ãªæ¶è²»ãæç€ºçã§å¶åŸ¡ãããã + +### TypeScriptç¹æã®èæ ®ç¹ + +- `TreeNode | null` ãšãã **Unionå**ã§ nullå®å šæ§ïŒ`null`ã«ããã¯ã©ãã·ã¥ãé²ãä»çµã¿ïŒã衚çŸã§ãã +- `!` énull ã¢ãµãŒã·ã§ã³ïŒ`queue.shift()!` ã®ããã«ã絶察ã«nullã§ãªããšã³ã³ãã€ã©ã«äŒããèšå·ïŒã¯ãªãã¹ãé¿ããæç€ºçãã§ãã¯ãåªå ãã + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **èããŒãïŒleaf nodeïŒ**ïŒå·Šãå³ãåã©ãããªãããŒããæšã®æ«ç«¯ +> - **BFSïŒBreadth-First Search / å¹ åªå æ¢çŽ¢ïŒ**ïŒæšãå³ïŒã°ã©ãïŒããæ·±ãã®æµ ãé ãã«æ¢çŽ¢ããæ¹æ³ãéå±€ããšã«æšªã«åºãããªããæ¢ã +> - **DFSïŒDepth-First Search / æ·±ãåªå æ¢çŽ¢ïŒ**ïŒæšããæ ¹ããèãŸã§äžæ¬éãæãé²ãã§ãæ¢çŽ¢ããæ¹æ³ãååž°ã§å®è£ ãããããšãå€ã +> - **Unionå**ïŒ`A | B` ã®ããã«è€æ°ã®åã®ã©ã¡ããã§ããå¯èœæ§ã衚ãTypeScriptåºæã®åè¡šèš + +--- + +## 2. ã¢ã«ãŽãªãºã ã¢ãããŒãæ¯èŒ + +> ð¡ åãåé¡ã§ãè§£ãæ¹ã¯è€æ°ãããŸãããéãïŒæéèšç®éïŒããã¡ã¢ãªïŒç©ºéèšç®éïŒããTypeScriptãšã®çžæ§ãã®èгç¹ã§æ¯ã¹ãŠæé©ãªãã®ãéžã³ãŸãã + +| ã¢ãããŒã | æéèšç®é | 空éèšç®é | TSå®è£ ã³ã¹ã | åå®å šæ§ | å¯èªæ§ | åè | +| --------------------------- | ------------------ | ---------- | ------------ | -------- | ------ | ---------------------------- | +| **BFSïŒå¹ åªå æ¢çŽ¢ïŒ** | O(n) â»æ©æçµäºãã | O(w)â»1 | äž | é« | é« | æåã®èã§å³çµäºã§ããæéè§£ | +| DFS ååž°ïŒRecursiveïŒ | O(n) | O(h)â»2 | äœ | é« | æé« | åã£ãæšã§ã¹ã¿ãã¯æº¢ããªã¹ã¯ | +| DFS å埩ïŒIterative StackïŒ | O(n) | O(n) | äž | é« | äž | ã¹ã¿ãã¯æº¢ããåé¿ã§ãã | + +â»1 `w` = æšã®æå€§å¹ ïŒ1ã¬ãã«ã«ååšããæå€§ããŒãæ°ïŒãå®å šäºåæšã§ã¯ O(n/2) +â»2 `h` = æšã®é«ãïŒæ ¹ããæãæ·±ãèãŸã§ïŒãææª O(n)ãå¹³å O(log n) + +> ð¡ **Big-Oèšæ³ã®èªã¿æ¹**ïŒååŠè åãïŒ +> +> - `O(1)`ïŒå ¥åã®å€§ããã«é¢ããããåžžã«äžå®ã®æéã»ã¡ã¢ãªã§æžã +> - `O(n)`ïŒããŒãæ°ã2åã«ãªããšãåŠçãçŽ2åã«ãªã +> - `O(h)`ïŒæšã®é«ãã«æ¯äŸããã©ã³ã¹ã®åããæšãªã `O(log n)` ãšåç + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **æéèšç®é**ïŒå ¥åã®å€§ããã«å¯ŸããŠåŠçã«ãããæéãã©ãå¢ãããã®ç®å® +> - **空éèšç®é**ïŒåŠçäžã«äœ¿ãã¡ã¢ãªéãã©ãå¢ãããã®ç®å® +> - **ã¹ã¿ãã¯ãªãŒããŒãããŒ**ïŒååž°ã®åŒã³åºããæ·±ããªããããŠã¡ã¢ãªã溢ãããšã©ãŒ + +--- + +## 3. éžæããã¢ã«ãŽãªãºã ãšçç± + +- **éžæããã¢ãããŒã**: **BFSïŒå¹ åªå æ¢çŽ¢ïŒ** + +- **çç±**: + - ãæçããæ±ããåé¡ã§ã¯ããæµ ãã¬ãã«ããé ã«æ¢ã BFSããèªç¶ã«äžèŽãããDFSã¯å šãŠã®èã確èªããŠããæ¯èŒããã®ã«å¯Ÿãã**BFSã¯æåã®èãèŠã€ããç¬éã«ç¢ºå®ã«æå°æ·±ããšèšãã** + - äŸ2ã®ãããªçŽç·ç¶ã®æšã§ã DFSïŒååž°ïŒã¯ O(n) ã®ã¹ã¿ãã¯ãæ¶è²»ããããBFS ã¯ãã¥ãŒã§ç®¡çããããã¹ã¿ãã¯ãªãŒããŒãããŒãèµ·ããªã + - TypeScript ã§ã¯é åããã¥ãŒãšããŠäœ¿ãå®è£ ãã·ã³ãã«ã§åå®å šã«æžãããã + +- **TypeScriptç¹æã®æé©åãã€ã³ã**: + - ã¿ãã«åïŒïŒè€æ°ã®ç°ãªãåã®å€ãäžçµã«ãŸãšããé åã®åïŒ`[TreeNode, number]` ã§ããŒããšæ·±ãããã¢ãšããŠç®¡çããåå®å šã«ãã¥ãŒãè¡šçŸ + - `null` ãã§ãã¯ã TypeScript ã®åã·ã¹ãã ã匷å¶ãããããèå€å®ã®æŒããã³ã³ãã€ã«æã«é²ãã + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **ãã¥ãŒïŒQueueïŒ**ïŒãå ã«å ¥ãããã®ãå ã«åãåºããããŒã¿æ§é ãããã¡ã¹ãããŒãã®è¡åããšåãã€ã¡ãŒãž +> - **ã¿ãã«å**ïŒ`[string, number]` ã®ããã«ãèŠçŽ ã®æ°ãšåèŠçŽ ã®åãåºå®ãããé åã®å +> - **ã³ã³ãã€ã«æ**ïŒTypeScriptã³ãŒããJavaScriptã«å€æããæ®µéãããã§ãšã©ãŒãæ€åºã§ãããšå®è¡æãã°ãé²ãã + +--- + +## 4. å®è£ ã³ãŒã + +> ð¡ **ã³ãŒãå šäœã®éªšæ Œ**ïŒå ã«æ§é ãææ¡ããŠããã³ãŒããèªã¿ãŸãããïŒ +> +> 1. **æ ¹ã null ãªã 0 ãè¿ã**ïŒç©ºã®æšã®ç¹å¥ã±ãŒã¹ïŒ +> 2. **BFS çšã®ãã¥ãŒã«æ ¹ããŒããšæ·±ã1ãå ¥ããŠéå§** +> 3. **ãã¥ãŒããåãåºã â èãªãå³ returnãåãããã°ãã¥ãŒã«è¿œå ** +> 4. **ïŒå¿µã®ããïŒå šããŒãæ¢çŽ¢ããŠãèããªããã° 0 ãè¿ã** + +### ð æçµè§£çïŒLeetCode æåºãã©ãŒãããïŒ + +```typescript +// Runtime 1 ms +// Beats 84.75% +// Memory 94.50 MB +// Beats 56.90% + +function minDepth(root: TreeNode | null): number { + // ââââââââââââââââââââââââââââââââââââââââââââââââ + // ⌠ã±ãŒã¹1ïŒæšãç©ºïŒæ ¹ãnullïŒãªãæ·±ãã¯0 + // nullãã§ãã¯ãããã§è¡ãããšã§ãåŸç¶ã®åŠçã§ + // ãrootã絶察ã«ååšããããšå®å šã«ä»®å®ã§ãã + // ââââââââââââââââââââââââââââââââââââââââââââââââ + if (root === null) return 0; + + // ââââââââââââââââââââââââââââââââââââââââââââââââ + // ⌠BFSçšã®ãã¥ãŒãåæåãã + // ã¿ãã«å [TreeNode, number] = [ããŒã, çŸåšã®æ·±ã] + // æåã¯æ ¹ããŒããæ·±ã1ãšããŠæå ¥ãã + // ïŒãªã1ãïŒæ ¹ããŒãèªäœã1çªç®ã®ããŒãã ããïŒ + // ââââââââââââââââââââââââââââââââââââââââââââââââ + const queue: Array<[TreeNode, number]> = [[root, 1]]; + + // ââââââââââââââââââââââââââââââââââââââââââââââââ + // ⌠ãã¥ãŒã空ã«ãªããŸã§ã«ãŒãïŒ= å šããŒããæ¢çŽ¢ïŒ + // èãèŠã€ãã£ãç¬éã« return ããã®ã§ + // éåžžã¯ãã¥ãŒã空ã«ãªãåã«çµäºãã + // ââââââââââââââââââââââââââââââââââââââââââââââââ + while (queue.length > 0) { + // ãã¥ãŒã®å é ããããŒããšæ·±ããåãåºã + // shift() ã¯é åã®å é èŠçŽ ãåãåºãæäœïŒBFSã®æ¬è³ªïŒ + // ã! ãã¯ãshift()ã®çµæãundefinedã§ãªãããšã³ã³ãã€ã©ã«ä¿èšŒããããã®èšå· + // â» whileæ¡ä»¶ queue.length > 0 ã§ç©ºã§ãªãããšãç¢ºèªæžã¿ãªã®ã§å®å š + const [node, depth] = queue.shift()!; + + // ââââââââââââââââââââââââââââââââââââââââââââ + // ⌠èããŒãã®å€å®ïŒå·Šãå³ãåããªã = è + // BFSã¯æµ ãé ã«æ¢çŽ¢ãããããæåã«èŠã€ãã£ã + // èãå¿ ãæå°æ·±ããæã€ â å³åº§ã«returnã§ãã + // ââââââââââââââââââââââââââââââââââââââââââââ + if (node.left === null && node.right === null) { + return depth; // ð¯ æçæ·±ãã確å®ïŒ + } + + // ââââââââââââââââââââââââââââââââââââââââââââ + // ⌠巊ã®åãããå ŽåïŒãã¥ãŒã«è¿œå ïŒæ·±ãã+1ïŒ + // null ãã§ãã¯ãå ã«è¡ãããšã§ã + // ååšããªãåã远å ããç¡é§ãé²ã + // ââââââââââââââââââââââââââââââââââââââââââââ + if (node.left !== null) { + queue.push([node.left, depth + 1]); + } + + // ââââââââââââââââââââââââââââââââââââââââââââ + // ⌠å³ã®åãããå ŽåïŒåæ§ã«ãã¥ãŒã«è¿œå + // ââââââââââââââââââââââââââââââââââââââââââââ + if (node.right !== null) { + queue.push([node.right, depth + 1]); + } + } + + // ââââââââââââââââââââââââââââââââââââââââââââââââ + // ⌠ããã«ã¯éåžžå°éããªãïŒæ ¹ãnullã§ãªãæå¹ãªæšãªã + // å¿ ãã©ããã«èãååšããããïŒ + // TypeScriptã®ã³ã³ãã€ã©ãæºè¶³ãããããïŒé¢æ°ã + // å¿ ãå€ãè¿ãããšãä¿èšŒããããïŒã«èšè¿°ãã + // ââââââââââââââââââââââââââââââââââââââââââââââââ + return 0; +} +``` + +--- + +### ð åäœãã¬ãŒã¹ïŒ2ã€ã®äŸã§å€æ°ãã©ãå€ããã + +#### Example 1ïŒ`root = [3,9,20,null,null,15,7]` + +``` + 3 â æ·±ã 1 + / \ + 9 20 â æ·±ã 2 + / \ + 15 7 â æ·±ã 3 +``` + +``` +åæç¶æ : + queue = [ [Node(3), 1] ] + +âââ ã«ãŒã1åç® âââ + åãåºã: [Node(3), depth=1] + Node(3).left = Node(9) â null ã§ã¯ãªã + Node(3).right = Node(20) â null ã§ã¯ãªã + â èã§ã¯ãªã + queue ã«è¿œå : [Node(9), 2], [Node(20), 2] + queue = [ [Node(9), 2], [Node(20), 2] ] + +âââ ã«ãŒã2åç® âââ + åãåºã: [Node(9), depth=2] + Node(9).left = null + Node(9).right = null + â ð¯ äž¡æ¹ null = èããŒãçºèŠïŒ + return 2 â çã確å®ïŒæ®ãã®ãã¥ãŒã¯åŠçäžèŠ +``` + +#### Example 2ïŒ`root = [2,null,3,null,4,null,5,null,6]`ïŒçŽç·ç¶ã®æšïŒ + +``` + 2 â æ·±ã 1 + \ + 3 â æ·±ã 2 + \ + 4 â æ·±ã 3 + \ + 5 â æ·±ã 4 + \ + 6 â æ·±ã 5ïŒå¯äžã®èïŒ +``` + +``` +åæ: queue = [ [Node(2), 1] ] + +ã«ãŒã1: Node(2) â left=null, right=Node(3) + â èã§ãªãïŒleftãnullã§ãrightãããããïŒïŒ + â çœ ïŒleftãnullã ãããšãã£ãŠèãšå€æããŠã¯ãããªã + queue = [ [Node(3), 2] ] + +ã«ãŒã2: Node(3) â left=null, right=Node(4) + â èã§ãªããqueue = [ [Node(4), 3] ] + +ã«ãŒã3: Node(4) â left=null, right=Node(5) + â èã§ãªããqueue = [ [Node(5), 4] ] + +ã«ãŒã4: Node(5) â left=null, right=Node(6) + â èã§ãªããqueue = [ [Node(6), 5] ] + +ã«ãŒã5: Node(6) â left=null, right=null + â ð¯ èããŒãçºèŠïŒ return 5 +``` + +--- + +### âš åèïŒDFS ååž°çïŒå¯èªæ§éèŠã»æ¥åéçºåãïŒ + +ãã¡ãã玹ä»ããŸããã³ãŒããéåžžã«çãçŽæçã§ããã**æ·±ãæšã§ã¹ã¿ãã¯ãªãŒããŒãããŒã®ãªã¹ã¯**ããããŸãã + +> ãã®ã³ãŒãã®æ§é ïŒ +> +> 1. `null` ãªã 0 ãè¿ãïŒããŒã¹ã±ãŒã¹ïŒ +> 2. å·Šã ããã â å·Šã«é²ãïŒå³æ¹åãç¡èŠããïŒ +> 3. å³ã ããã â å³ã«é²ãïŒå·Šæ¹åãç¡èŠããïŒ +> 4. äž¡æ¹ãã â äž¡æ¹æ¢çŽ¢ã `Math.min` ã§å°ããæ¹ãè¿ã + +```typescript +function minDepth(root: TreeNode | null): number { + // ããŒã¹ã±ãŒã¹ïŒïŒååž°ã®çµäºæ¡ä»¶ïŒïŒ + // æ ¹ã null ãªãæ·±ã0ããã®ãã§ãã¯ããªããš + // null.left ã«ã¢ã¯ã»ã¹ããŠã¯ã©ãã·ã¥ãã + if (root === null) return 0; + + // ââââââââââââââââââââââââââââââââââââââââââââââââ + // ⌠éèŠïŒçæ¹ã®åã ãã null ã®å Žåã®åŠç + // å·Šã null â å·Šæ¹åã«ã¯èããªã â 峿¹åã®ã¿æ¢çŽ¢ + // ãnull ã®æ¹åã®æ·±ã = 0ããæå°å€ã«äœ¿ã£ãŠããŸããš + // 誀ã£ãŠ0+1=1ãæå°å€ã«ãªããã°ã«ãªãïŒ + // ââââââââââââââââââââââââââââââââââââââââââââââââ + if (root.left === null) { + // å·Šã®åãååšããªãå ŽåïŒå³æ¹åã®æå°æ·±ã + èªåèªèº«ã®1 + return 1 + minDepth(root.right); + } + if (root.right === null) { + // å³ã®åãååšããªãå ŽåïŒå·Šæ¹åã®æå°æ·±ã + èªåèªèº«ã®1 + return 1 + minDepth(root.left); + } + + // äž¡æ¹ã®åãååšããå ŽåïŒ + // å·Šå³ããããã®æå°æ·±ããæ±ããå°ããæ¹ + èªåèªèº«ã®1 + return 1 + Math.min(minDepth(root.left), minDepth(root.right)); +} +``` + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **`Array.shift()`**ïŒé åã®å é èŠçŽ ãåãåºããŠãã®å€ãè¿ãæäœãBFSã§ãæåã«è¿œå ãããã®ãæåã«åŠçãããããã«äœ¿ã +> - **ã¿ãã«å**ïŒ`[TreeNode, number]` ã®ããã«èŠçŽ æ°ãšååãåºå®ãããé åã®åïŒJavaScriptã«ã¯ååšãããTypeScriptåºæã®ä»çµã¿ïŒ +> - **ããŒã¹ã±ãŒã¹**ïŒååž°é¢æ°ã®ãããä»¥äžæ·±ãæœããªããŠãããçµäºæ¡ä»¶ +> - **`readonly`修食å**ïŒå€æ°ã倿Žã§ããªãããã«ãã TypeScript åºæã®æ©èœãJavaScriptã«ã¯çžåœããæ§æããªããæå³ãã¬æžãæããã³ã³ãã€ã«æã«é²ã + +--- + +## 5. ããžã¥ã¢ã«è§£èª¬ïŒBFS ã®åãïŒ--- + +## 6. TypeScript åºæã®æé©åèŠ³ç¹ + +### åå®å šæ§ã®æŽ»çš + +**UnionåïŒå ±çšäœåïŒ**ã«ãã null å®å šæ§ã®ç¢ºä¿ïŒ + +```typescript +// JavaScriptã«ã¯ãªãæŠå¿µïŒåã¬ãã«ã§nullã®å¯èœæ§ãæç€ºã§ãã +// TreeNode | null â ãTreeNodeãnullã®ã©ã¡ããã§ããããšåã§è¡šæ +// ã³ã³ãã€ã©ã null ãã§ãã¯ã匷å¶ããŠããã + +// ðŽ JavaScriptãªãå®è¡æãŸã§æ°ä»ããªãïŒã¯ã©ãã·ã¥ããïŒ +const left = root.left.val; // root.left ã null ãªã TypeError! + +// â TypeScriptãªã null ãã§ãã¯ãå¿ãããšã³ã³ãã€ã«ãšã©ãŒã«ãªã +if (node.left !== null) { + queue.push([node.left, depth + 1]); // ããã§ã¯ left ã TreeNode ãšç¢ºå® +} +``` + +**ã¿ãã«å**ã§ãã¥ãŒã®èŠçŽ ãå³å¯ã«åå®çŸ©ïŒ + +```typescript +// JavaScriptã«ã¯ãªãæ§æïŒèŠçŽ æ°ãšååãåºå®ãããé åã®å +// [TreeNode, number] â ã1çªç®ã¯TreeNodeã2çªç®ã¯numberããšä¿èšŒ +// [Node(3), 1] ã®ããã«äœ¿ãããšã§ãããŒããšæ·±ããåžžã«ãã¢ã«ãªã + +// ãas constãã䜿ããšããã«åãçµã蟌ããïŒconst assertionãšåŒã¶ïŒ +// â» this problem doesn't need it, but good to know + +const queue: Array<[TreeNode, number]> = [[root, 1]]; +// â â +// ããŒãå æ·±ãïŒæ°å€åïŒ +// ãã®åå®çŸ©ã«ããã誀ã£ãŠ [1, root] ã®é ã§å ¥ãããšã³ã³ãã€ã«ãšã©ãŒã«ãªã +``` + +### readonly ãš Pure functionïŒçŽç²é¢æ°ïŒ + +BFS è§£æ³ã¯ãã§ã« Pure function ã®æ§è³ªãæã£ãŠããŸãïŒ + +```typescript +// â å ¥åã® root ã倿ŽããŠããªãïŒèªãã ãïŒ +// â å€éšã®å€æ°ïŒã°ããŒãã«ç¶æ ïŒã«äŸåããŠããªã +// â åã root ãå ¥ããã°å¿ ãåãæ·±ããè¿ã£ãŠãã + +function minDepth(root: TreeNode | null): number { + // root ã倿ŽããæäœïŒäŸïŒroot.val = 999ïŒã¯äžåè¡ã£ãŠããªã + // â å¯äœçšããªã = Pure function +} +``` + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **UnionåïŒå ±çšäœåïŒ**ïŒ`A | B` ã®ããã«è€æ°ã®åã®ã©ã¡ããã衚ã TypeScript åºæã®å衚èšã`TreeNode | null` ã¯ãTreeNodeãnullã®ã©ã¡ããã +> - **ã¿ãã«å**ïŒ`[string, number]` ã®ããã«èŠçŽ æ°ãšåèŠçŽ ã®åãåºå®ãããé åã®åãã€ã³ããã¯ã¹ã§ `[0]` ãstringã`[1]` ãnumberãšä¿èšŒããã +> - **Pure functionïŒçŽç²é¢æ°ïŒ**ïŒåãå ¥åãäžãããšå¿ ãåãåºåãè¿ããå€éšã®ç¶æ ãå€ããªã颿°ããã¹ãããããããã°ãå°ãªã +> - **const assertion**ïŒ`as const` ãšæžãããšã§ã倿°ã®åããªãã©ã«åïŒå ·äœçãªå€ãã®ãã®ïŒã«çµã蟌ã TypeScript åºæã®æ©èœ + +--- + +## ãŸãšã + +| èŠ³ç¹ | å 容 | +| ------------------ | -------------------------------------------------------------------- | +| **åé¡ã®æ¬è³ª** | æ ¹ããæãè¿ãèãŸãŠã®æçè·é¢ | +| **æå€§ã®çœ ** | çæ¹ã®åã `null` ã®ããŒãã¯ãèãã§ã¯ãªã | +| **éžæè§£æ³** | BFSïŒæåã®è = 確å®ã«ææµ ïŒ | +| **æéèšç®é** | O(n) â ææªã±ãŒã¹ã§å šããŒãæ¢çŽ¢ | +| **空éèšç®é** | O(w) â ãã¥ãŒã®æå€§ãµã€ãºã¯æšã®æå€§å¹ | +| **TypeScriptè²¢ç®** | `TreeNode \| null` ã«ãã null å®å š + ã¿ãã«åã§ãã¥ãŒãåå®å šã«ç®¡ç | diff --git a/Algorithm/BinaryTree/leetcode/111. Minimum Depth of Binary Tree/claude sonnet 4.6 adaptive/README.md b/Algorithm/BinaryTree/leetcode/111. Minimum Depth of Binary Tree/claude sonnet 4.6 adaptive/README.md new file mode 100644 index 0000000..080ecab --- /dev/null +++ b/Algorithm/BinaryTree/leetcode/111. Minimum Depth of Binary Tree/claude sonnet 4.6 adaptive/README.md @@ -0,0 +1,862 @@ +# Minimum Depth of Binary Tree â æ ¹ããæçã§èã«å°éããæ·±ããæ±ãã + +> **LeetCode #111** · é£æåºŠ: Easy · ã«ããŽãª: Tree / BFS + +--- + +## ç®æ¬¡ + +- [æŠèŠ](#overview) +- [ã¢ã«ãŽãªãºã èŠç¹ïŒTL;DRïŒ](#tldr) +- [å³è§£](#figures) +- [æ£ããã®ã¹ã±ãã](#correctness) +- [èšç®é](#complexity) +- [Python å®è£ ](#impl) +- [CPython æé©åãã€ã³ã](#cpython) +- [ãšããžã±ãŒã¹ãšæ€èšŒèгç¹](#edgecases) +- [FAQ](#faq) + +--- + +
+ BFSïŒå¹ åªå æ¢çŽ¢ïŒã«ãã O(n) å®è£ +
++ ð¡ + äžèšã§èšããšïŒãæ ¹ããŒãããæãè¿ãèããŒããŸã§ã®æççµè·¯ã®ããŒãæ°ãæ±ããåé¡ã +
+ ++ ð¡ + ãã®åé¡ãäžèšã§èšããšïŒãæ ¹ããŒãããæãè¿ãèããŒããŸã§ã®æççµè·¯ã®ããŒãæ°ãè¿ãåé¡ã +
++ ãæå°æ·±ãããšã¯ãæšã®æ ¹ïŒäžçªäžïŒããåºçºããŠãæåã«å°éã§ããèïŒåãæããªãããŒãïŒãŸã§ã®ããŒãæ°ã®ããšã§ããæ·±ãã¯æ ¹ã1ãšããŠæ°ããŸããèããŒããšã¯ãå·Šã®åãå³ã®åãã©ã¡ããååšããªãããŒãã®ããšã§ãã +
++ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
+äŸ1: éåžžã®äºåæš
++å ¥å: root = [3,9,20,null,null,15,7] + + 3 + / \ + 9 20 + / \ + 15 7 + +åºå: 2+
+ æ ¹(3)âå·Šã®å(9) + ã®çµè·¯ãé·ã2ã§æçãããŒã9ã¯å·Šãå³ãåããªããèãã®ãããæ·±ã2ãçãã«ãªããŸãã +
++ äŸ2: äžæ¹åã«ã ã䌞ã³ãæš +
++å ¥å: root = [2,null,3,null,4,null,5,null,6] + +2 + \ + 3 + \ + 4 + \ + 5 + \ + 6 â å¯äžã®è + +åºå: 5+
+ 峿¹åã«ã®ã¿åããããå¯äžã®èã¯ããŒã6ãèãŸã§ã®è·é¢ã5ãªã®ã§ãã®æ·±ããçãã§ãã +
++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+from typing import Optional
+from collections import deque
+
+
+class Solution:
+ def minDepth(self, root: Optional[TreeNode]) -> int:
+ # âââââââââââââââââââââââââââââââââââââ
+ # ãšããžã±ãŒã¹: ç©ºã®æš â æ·±ã 0 ãè¿ã
+ # æ ¹ããªããã°ãèãŸã§ã®éãèªäœãååšããªã
+ # âââââââââââââââââââââââââââââââââââââ
+ if root is None:
+ return 0
+
+ # âââââââââââââââââââââââââââââââââââââ
+ # BFS ãã¥ãŒãåæåãã
+ # deque ã® popleft() 㯠O(1) â list ããå¹çç
+ # ã¿ãã« (ããŒã, çŸåšã®æ·±ã) ã§ãã¢ã管çãã
+ # âââââââââââââââââââââââââââââââââââââ
+ queue: deque = deque()
+ queue.append((root, 1)) # æ ¹ããŒãã¯æ·±ã 1 ããã¹ã¿ãŒã
+
+ while queue:
+ # popleft() = FIFOïŒå
å
¥ãå
åºãïŒâ æµ
ãé ã«åŠç
+ node, depth = queue.popleft()
+
+ # âââââââââââââââââââââââââââââââââ
+ # èããŒãå€å®: å·Šãå³ãåããªã = è
+ # BFS ã¯æµ
ãé ãªã®ã§ãæåã®è = æå°æ·±ã
+ # âââââââââââââââââââââââââââââââââ
+ if node.left is None and node.right is None:
+ return depth # æå°æ·±ã確å®ïŒ
+
+ # åããŒãã¯ååšããå Žåã®ã¿ãã¥ãŒã«è¿œå
+ if node.left is not None:
+ queue.append((node.left, depth + 1))
+ if node.right is not None:
+ queue.append((node.right, depth + 1))
+
+ return 0 # æå¹ãªæšãªãéåžžããã«å°éããªã
+
+ + â¶ å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®åäœãã¬ãŒã¹ +
++åæç¶æ : queue = [(node=3, depth=1)] + +å埩 1: pop â (node=3, depth=1) + å·Šã®å: 9 ãã, å³ã®å: 20 ãã â èã§ã¯ãªã + â queue ã« (node=9, depth=2) ãš (node=20, depth=2) ã远å + â queue = [(node=9, depth=2), (node=20, depth=2)] + +å埩 2: pop â (node=9, depth=2) + å·Šã®å: None, å³ã®å: None â ð¿ èããŒãçºèŠïŒ + â return 2 â çã: 2ïŒæ¢çŽ¢çµäºïŒ + +â» node=20 ã¯ãã¥ãŒã«æ®ã£ããŸãŸã§ãããèãèŠã€ããæç¹ã§å³ return + ãããããã以äžåŠçã¯è¡ãããŸããã+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®ãããŒè¿œè·¡ +
+
+ ãããŒã®èŠç¹ïŒ
+ BFS
+ ã¯ãã¥ãŒã䜿ã£ãŠãæµ
ãããŒãããé çªã«ãåŠçããŸããã«ãŒãïŒçŽ«ã®ç¢å°ïŒã¯æ¬¡ã®ããŒããåŠçããããã«ãã¥ãŒãžæ»ãããšã衚ããŠããŸããå³åŽã®ç·ã®ç·ïŒãµã€ãã©ã€ã³ïŒã¯ãæ¡ä»¶ãæºãããã®ã§æ©æãªã¿ãŒã³ãããçµè·¯ã§ããroot is None
+ ã®ãšã㯠0 ããèããŒããèŠã€ãããšãã¯ãã®ãšãã®
+ depth
+ ãå³åº§ã«è¿ããŸãã
+
+ ð Big-O èšæ³ã®èªã¿æ¹ïŒå ¥åãµã€ãº n ã倧ãããªããšåŠçæéãã©ãå€ãããïŒ +
+| + çš®å¥ + | ++ èšæ³ + | ++ 倿°ã®æå³ + | ++ ã±ãŒã¹ + | +
|---|---|---|---|
| + æéèšç®é + | +
+ O(n)
+ |
+ + n = æšã®ããŒãç·æ° + | ++ ææªã±ãŒã¹ïŒå šããŒã蚪åïŒ + | +
| + 空éèšç®é + | +
+ O(w)
+ |
+ + w = æšã®æå€§å¹ ïŒ1段ã®ããŒãæå€§æ°ïŒ + | ++ å®å šäºåæšã§ã¯ O(n/2) â O(n) + | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ æé O(n)ïŒææªã®ã±ãŒã¹ã§ã¯ãèãæåŸã®1åã§æšã®ææ·±éšã«ããç¶æ³ã§ãïŒäŸ2ã®ãããªäžæ¹åã«äŒžã³ãæšïŒããã®å Žåãå
š
+ n ããŒãããã¥ãŒãã1åãã€åãåºããŠåŠçãããããåŠçåæ°ã¯ n
+ ã«æ¯äŸããŸãããã ãæè¯ã®ã±ãŒã¹ã¯æ ¹ããŒãèªäœãèïŒn=1ïŒã®ãšãã§ãå³åº§ã«
+ O(1) ã§è¿ããŸãã
空é O(w)ïŒãã¥ãŒã«ã¯ãåãæ·±ãã®ããŒãããåæã«èç©ãããŸããæãããŒããå¯éããæ®µïŒ=
+ æšã®æå€§å¹
wïŒã®ãšãããã¥ãŒã®ãµã€ãºãæå€§ã«ãªããŸããå®å
šäºåæšã®æäžæ®µã§ã¯
+ w â n/2 ãšãªããäºå®äž O(n) ãšç䟡ã§ãã
+
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããåç §ããŠãã ããã +
+collections.deque
+ ãæäŸããŸããå
é ãšæ«å°Ÿã®äž¡ç«¯ãã O(1)
+ ã®å®æ°æéã§èŠçŽ ã®è¿œå ã»åãåºããã§ããŸããéåžžã®
+ list ã®
+ pop(0)
+ 㯠O(n) ã®ã³ã¹ããããããããBFS ã«ã¯ deque ã®äœ¿çšãå¿
é ã§ãã
+ node.left is None and node.right is None
+ ã§ããæ³šæç¹ïŒå·Šå³ã©ã¡ããäžæ¹ã®åããæããªãããŒãã¯èã§ã¯ãããŸããã
+ append()
+ ã§æ«å°Ÿã«è¿œå ããpopleft()
+ ã§å
é ããåãåºããŸãã
+ TreeNode
+ ã¯ã©ã¹ã䜿ãããvalïŒå€ïŒã»leftïŒå·Šã®åïŒã»rightïŒå³ã®åïŒã®3ã€ã®å±æ§ãæã¡ãŸãã
+ + BFSïŒå¹ åªå æ¢çŽ¢ïŒã«ãã O(n) å®è£ +
++ ð¡ + äžèšã§èšããšïŒãæ ¹ããŒãããæãè¿ãèããŒããŸã§ã®æççµè·¯ã®ããŒãæ°ãæ±ããåé¡ã +
+ ++ ð¡ + ãã®åé¡ãäžèšã§èšããšïŒãæ ¹ããŒãããæãè¿ãèããŒããŸã§ã®æççµè·¯ã®ããŒãæ°ãè¿ãåé¡ã +
++ ãæå°æ·±ãããšã¯ãæšã®æ ¹ïŒäžçªäžïŒããåºçºããŠãæåã«å°éã§ããèïŒåãæããªãããŒãïŒãŸã§ã®ããŒãæ°ã®ããšã§ããæ·±ãã¯æ ¹ã1ãšããŠæ°ããŸããèããŒããšã¯ãå·Šã®åãå³ã®åãã©ã¡ããååšããªãããŒãã®ããšã§ãã +
++ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
+äŸ1: éåžžã®äºåæš
++å ¥å: root = [3,9,20,null,null,15,7] + + 3 + / \ + 9 20 + / \ + 15 7 + +åºå: 2+
+ æ ¹(3)âå·Šã®å(9) + ã®çµè·¯ãé·ã2ã§æçãããŒã9ã¯å·Šãå³ãåããªããèãã®ãããæ·±ã2ãçãã«ãªããŸãã +
++ äŸ2: äžæ¹åã«ã ã䌞ã³ãæš +
++å ¥å: root = [2,null,3,null,4,null,5,null,6] + +2 + \ + 3 + \ + 4 + \ + 5 + \ + 6 â å¯äžã®è + +åºå: 5+
+ 峿¹åã«ã®ã¿åããããå¯äžã®èã¯ããŒã6ãèãŸã§ã®è·é¢ã5ãªã®ã§ãã®æ·±ããçãã§ãã +
++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+from typing import Optional
+from collections import deque
+
+
+class Solution:
+ def minDepth(self, root: Optional[TreeNode]) -> int:
+ # âââââââââââââââââââââââââââââââââââââ
+ # ãšããžã±ãŒã¹: ç©ºã®æš â æ·±ã 0 ãè¿ã
+ # æ ¹ããªããã°ãèãŸã§ã®éãèªäœãååšããªã
+ # âââââââââââââââââââââââââââââââââââââ
+ if root is None:
+ return 0
+
+ # âââââââââââââââââââââââââââââââââââââ
+ # BFS ãã¥ãŒãåæåãã
+ # deque ã® popleft() 㯠O(1) â list ããå¹çç
+ # ã¿ãã« (ããŒã, çŸåšã®æ·±ã) ã§ãã¢ã管çãã
+ # âââââââââââââââââââââââââââââââââââââ
+ queue: deque = deque()
+ queue.append((root, 1)) # æ ¹ããŒãã¯æ·±ã 1 ããã¹ã¿ãŒã
+
+ while queue:
+ # popleft() = FIFOïŒå
å
¥ãå
åºãïŒâ æµ
ãé ã«åŠç
+ node, depth = queue.popleft()
+
+ # âââââââââââââââââââââââââââââââââ
+ # èããŒãå€å®: å·Šãå³ãåããªã = è
+ # BFS ã¯æµ
ãé ãªã®ã§ãæåã®è = æå°æ·±ã
+ # âââââââââââââââââââââââââââââââââ
+ if node.left is None and node.right is None:
+ return depth # æå°æ·±ã確å®ïŒ
+
+ # åããŒãã¯ååšããå Žåã®ã¿ãã¥ãŒã«è¿œå
+ if node.left is not None:
+ queue.append((node.left, depth + 1))
+ if node.right is not None:
+ queue.append((node.right, depth + 1))
+
+ return 0 # æå¹ãªæšãªãéåžžããã«å°éããªã
+
+ + â¶ å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®åäœãã¬ãŒã¹ +
++åæç¶æ : queue = [(node=3, depth=1)] + +å埩 1: pop â (node=3, depth=1) + å·Šã®å: 9 ãã, å³ã®å: 20 ãã â èã§ã¯ãªã + â queue ã« (node=9, depth=2) ãš (node=20, depth=2) ã远å + â queue = [(node=9, depth=2), (node=20, depth=2)] + +å埩 2: pop â (node=9, depth=2) + å·Šã®å: None, å³ã®å: None â ð¿ èããŒãçºèŠïŒ + â return 2 â çã: 2ïŒæ¢çŽ¢çµäºïŒ + +â» node=20 ã¯ãã¥ãŒã«æ®ã£ããŸãŸã§ãããèãèŠã€ããæç¹ã§å³ return + ãããããã以äžåŠçã¯è¡ãããŸããã+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®ãããŒè¿œè·¡ +
+
+ ãããŒã®èŠç¹ïŒ
+ BFS
+ ã¯ãã¥ãŒã䜿ã£ãŠãæµ
ãããŒãããé çªã«ãåŠçããŸããã«ãŒãïŒçŽ«ã®ç¢å°ïŒã¯æ¬¡ã®ããŒããåŠçããããã«ãã¥ãŒãžæ»ãããšã衚ããŠããŸããå³åŽã®ç·ã®ç·ïŒãµã€ãã©ã€ã³ïŒã¯ãæ¡ä»¶ãæºãããã®ã§æ©æãªã¿ãŒã³ãããçµè·¯ã§ããroot is None
+ ã®ãšã㯠0 ããèããŒããèŠã€ãããšãã¯ãã®ãšãã®
+ depth
+ ãå³åº§ã«è¿ããŸãã
+
+ ð Big-O èšæ³ã®èªã¿æ¹ïŒå ¥åãµã€ãº n ã倧ãããªããšåŠçæéãã©ãå€ãããïŒ +
+| + çš®å¥ + | ++ èšæ³ + | ++ 倿°ã®æå³ + | ++ ã±ãŒã¹ + | +
|---|---|---|---|
| + æéèšç®é + | +
+ O(n)
+ |
+ + n = æšã®ããŒãç·æ° + | ++ ææªã±ãŒã¹ïŒå šããŒã蚪åïŒ + | +
| + 空éèšç®é + | +
+ O(w)
+ |
+ + w = æšã®æå€§å¹ ïŒ1段ã®ããŒãæå€§æ°ïŒ + | ++ å®å šäºåæšã§ã¯ O(n/2) â O(n) + | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ æé O(n)ïŒææªã®ã±ãŒã¹ã§ã¯ãèãæåŸã®1åã§æšã®ææ·±éšã«ããç¶æ³ã§ãïŒäŸ2ã®ãããªäžæ¹åã«äŒžã³ãæšïŒããã®å Žåãå
š
+ n ããŒãããã¥ãŒãã1åãã€åãåºããŠåŠçãããããåŠçåæ°ã¯ n
+ ã«æ¯äŸããŸãããã ãæè¯ã®ã±ãŒã¹ã¯æ ¹ããŒãèªäœãèïŒn=1ïŒã®ãšãã§ãå³åº§ã«
+ O(1) ã§è¿ããŸãã
空é O(w)ïŒãã¥ãŒã«ã¯ãåãæ·±ãã®ããŒãããåæã«èç©ãããŸããæãããŒããå¯éããæ®µïŒ=
+ æšã®æå€§å¹
wïŒã®ãšãããã¥ãŒã®ãµã€ãºãæå€§ã«ãªããŸããå®å
šäºåæšã®æäžæ®µã§ã¯
+ w â n/2 ãšãªããäºå®äž O(n) ãšç䟡ã§ãã
+
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããåç §ããŠãã ããã +
+collections.deque
+ ãæäŸããŸããå
é ãšæ«å°Ÿã®äž¡ç«¯ãã O(1)
+ ã®å®æ°æéã§èŠçŽ ã®è¿œå ã»åãåºããã§ããŸããéåžžã®
+ list ã®
+ pop(0)
+ 㯠O(n) ã®ã³ã¹ããããããããBFS ã«ã¯ deque ã®äœ¿çšãå¿
é ã§ãã
+ node.left is None and node.right is None
+ ã§ããæ³šæç¹ïŒå·Šå³ã©ã¡ããäžæ¹ã®åããæããªãããŒãã¯èã§ã¯ãããŸããã
+ append()
+ ã§æ«å°Ÿã«è¿œå ããpopleft()
+ ã§å
é ããåãåºããŸãã
+ TreeNode
+ ã¯ã©ã¹ã䜿ãããvalïŒå€ïŒã»leftïŒå·Šã®åïŒã»rightïŒå³ã®åïŒã®3ã€ã®å±æ§ãæã¡ãŸãã
+ 175 interactive lessons across 6 domains
+176 interactive lessons across 6 domains