+ ååž° + ã€ã³ããã¯ã¹æž¡ã ã«ãã O(n) / O(log n) å®è£ +
++ ð¡ ãã®åé¡ãäžèšã§èšããš +
++ æé ãœãŒãæžã¿ãªã¹ããåãåããå·Šå³ã®éšåæšã®é«ãã®å·®ãåžžã« 1 以äžïŒïŒé«ã平衡ïŒã«ãªãäºåæ¢çŽ¢æšïŒBSTïŒã®ã«ãŒãããŒããè¿ãåé¡ã§ãããçãäžã®èŠçŽ ãæ ¹ã«ããããšããçºæ³ãæ žå¿ã§ããããååž°çã«ç¹°ãè¿ãããšã§èªç¶ã«å¹³è¡¡ãå®çŸãããŸãã +
++ â ïž ãªãåçŽãªæ¿å ¥ã§ã¯è§£ããªãã®ã +
+insert()
+ ãç¹°ãè¿ããšãæ¯åå³ã®åã«è¿œå ãããŠã竹ã®ãããªäžæ¬éã®æšãã«ãªããé«ãã
+ O(n) ã«ãªã
+ nums[:mid]
+ ã䜿ããšååž°ããšã«ãªã¹ãã³ããŒãçºçãã空éèšç®éã O(n log n)
+ ã«æªåãã
+ å ¥åºåäŸ 1
++ å ¥å: nums = [-10, -3, 0, 5, 9] +
++ åºå: [0, -3, 9, -10, null, 5] +
+
+ â é
åã®äžå€®
+ 0ïŒã€ã³ããã¯ã¹2ïŒãæ ¹ã«ããããšã§ãå·Šå³ã«å2èŠçŽ ãã€åé
ã§ããé«ã平衡ãå®çŸãããŸãã
+
å ¥åºåäŸ 2
+å ¥å: nums = [1, 3]
++ åºå: [3, 1] ãŸã㯠[1, null, 3] +
+
+ â 2èŠçŽ ã®å Žåãäžå€®ã€ã³ããã¯ã¹
+ mid = (0+1)//2 = 0
+ ãªã®ã§
+ 1
+ ãæ ¹ã«ãªããŸããã©ã¡ãã®åœ¢ãæ£è§£ãšããŠåçãããŸãã
+
ð å¶çŽ
++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+build(lo, hi)
+ ãå®çŸ©ã㊠nums ãåŒæ°ãªãã§åç
§ã§ããããã«ãã
+ lo > hi
+ ãªã
+ None
+ ãè¿ããŠååž°çµäº
+ mid = (lo + hi) // 2
+ ãèšç®ããŠæ ¹ããŒããäœæ
+ from typing import Optional
+
+# 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 sortedArrayToBST(self, nums: list[int]) -> Optional["TreeNode"]:
+ def build(lo: int, hi: int) -> Optional["TreeNode"]:
+ # ããŒã¹ã±ãŒã¹ïŒlo > hi ã®ãšã空åºé â None ãè¿ããŠååž°çµäº
+ # ãã®æ¡ä»¶ããªããšç¡éã«ãŒãã«ãªã RuntimeError ãçºçãã
+ if lo > hi:
+ return None
+
+ # äžå€®ã€ã³ããã¯ã¹ãåºé€ç®ïŒ//ïŒã§èšç®ãã
+ # ã¹ã©ã€ã¹ nums[lo:hi] ã䜿ããªãã®ã¯ãæ°ãããªã¹ãã®ã³ããŒãçºçããŠ
+ # 空éèšç®éã O(n log n) ã«æªåãããããã€ã³ããã¯ã¹ãªã O(1)ã
+ mid = (lo + hi) // 2
+
+ # äžå€®ã®å€ã§ããŒããäœæïŒãã®ããŒããçŸåšã®åºéã®ãæ ¹ãã«ãªãïŒ
+ # nums[mid] ãæ ¹ã«ããããšã§å·Šå³ã®èŠçŽ æ°ã®å·®ãåžžã« 1 以äžã«ä¿ããã
+ node = TreeNode(nums[mid])
+
+ # å·Šåå [lo, mid-1] ã§å·Šéšåæšãååž°æ§ç¯
+ # mid èªäœã¯çŸåšã®ããŒããšããŠäœ¿çšæžã¿ã®ããå«ãŸãªãïŒmid-1 ãŸã§ïŒ
+ node.left = build(lo, mid - 1)
+
+ # å³åå [mid+1, hi] ã§å³éšåæšãååž°æ§ç¯
+ node.right = build(mid + 1, hi)
+
+ # å·Šå³ã®åããŒããæ¥ç¶ããã宿ããŒããè¿ã
+ return node
+
+ # å
šäœã®ç¯å²ïŒã€ã³ããã¯ã¹ 0 ã æåŸã®ã€ã³ããã¯ã¹ïŒã§ååž°ãéå§
+ return build(0, len(nums) - 1)
+
+
+ + â¶ å ¥åäŸ nums = [-10, -3, 0, 5, 9] ã§ã®åäœãã¬ãŒã¹ +
++build(0, 4): + mid = 2 â node = TreeNode(0) â æ ¹ããŒã確å®ïŒ + node.left = build(0, 1) + mid = 0 â node = TreeNode(-10) + node.left = build(0, -1) â lo(0) > hi(-1) â None + node.right = build(1, 1) + mid = 1 â node = TreeNode(-3) â èããŒã + return TreeNode(-3) + return TreeNode(-10, left=None, right=TreeNode(-3)) + node.right = build(3, 4) + mid = 3 â node = TreeNode(5) + node.left = build(3, 2) â lo(3) > hi(2) â None + node.right = build(4, 4) + mid = 4 â node = TreeNode(9) â èããŒã + return TreeNode(9) + return TreeNode(5, left=None, right=TreeNode(9)) + +宿ãã BST: + 0 â æ ¹ïŒé åã®äžå€®ïŒ + / \ + -10 5 + \ \ + -3 9 + +é«ã: å·Š=2, å³=2 å·®=0 â é«ã平衡ïŒ+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ nums = [-10, -3, 0, 5, 9] ã§ã®ãããŒè¿œè·¡ +
+build(0, 4)
+ ãåŒã°ãã
+ mid=2, node=TreeNode(0)
+ build(0,1)
+ ã§åããããŒãååž°å®è¡ã
+ TreeNode(-10, right=TreeNode(-3))
+ ãæ§ç¯
+ build(3,4)
+ ã§
+ TreeNode(5, right=TreeNode(9))
+ ãæ§ç¯
+ TreeNode(0)
+ ãè¿ããŠçµäº
+ + ð Big-O èšæ³ã®èªã¿æ¹ïŒå ¥åãµã€ãº n + ã倧ãããªãã«ã€ããŠåŠçæéãã©ãå¢ãããã®ç®å®ïŒ +
+| + èšç®éã®çš®é¡ + | ++ æ¬å®è£ ïŒã€ã³ããã¯ã¹çïŒ + | ++ ã¹ã©ã€ã¹çïŒæ¯èŒïŒ + | +
|---|---|---|
| + æéèšç®é + | ++ O(n) + | ++ O(n log n) + | +
| + 空éèšç®éïŒè¿œå ïŒ + | ++ O(log n) + | ++ O(n log n) + | +
| + ã¹ã©ã€ã¹ã³ã㌠+ | ++ ãªã â + | ++ ããïŒæ¯åã³ããŒïŒâ + | +
| + n=10,000 æã®å垰深床 + | ++ â 14 段 + | ++ â 14 段 + | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ æéèšç®é O(n)ïŒnums
+ ã®åèŠçŽ ã¯ã¡ããã©1åã ã
+ TreeNode(nums[mid])
+ ãšããŠåŠçãããŸããn åã®èŠçŽ ãªã n
+ åã®ããŒãçæãèµ·ããããã以å€ã®åŠçïŒã€ã³ããã¯ã¹èšç®ã»ä»£å
¥ïŒã O(1)
+ ãªã®ã§å
šäœ O(n) ã§ãã
+
+ 空éèšç®é O(log n)ïŒã¹ã©ã€ã¹ã³ããŒã䜿ããªãããã远å ã¡ã¢ãªã¯ååž°ã¹ã¿ãã¯ïŒïŒé¢æ°ã®åŒã³åºãå±¥æŽãèšé²ããã¡ã¢ãªïŒã®ã¿ã§ããé«ãå¹³è¡¡ãªæšã®é«ã㯠+ logâ(n) çšåºŠãªã®ã§ãn=10,000 ã®ãšãååž°æ·±åºŠã¯æå€§ âlogâ(10000)â = 14 + 段çšåºŠãPython ã®ããã©ã«ãååž°äžéïŒ1000åïŒã«å¯ŸããŠäœè£ããããŸãã +
++ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ããã +
+lo > hiïŒæå¹ãªèŠçŽ ããªã空åºéïŒãããŒã¹ã±ãŒã¹ã§ãNone
+ ãè¿ããŸããããŒã¹ã±ãŒã¹ã¯ããã以äžå°ããåå²ã§ããªãæå°ã®åé¡ãã§ãã
+ //
+ æŒç®åã§è¡šããŸããäŸïŒ(0+4)//2 = 2ã(0+3)//2 = 1ãint((0+4)/2)
+ ãšåãçµæã§ãããCPython ã§ã¯
+ // ã¯
+ Cèšèªã¬ãã«ã®æŽæ°æŒç®ã«æé©åãããŠãããå倿ã³ã¹ãããããŸããã
+ nums[lo:hi]
+ ã®ããã«ãªã¹ãã®äžéšãåãåºãæäœãPython
+ ã§ã¯æ°ãããªã¹ããªããžã§ã¯ããããŒãïŒåçã¡ã¢ãªé åïŒã«çæãããŸããååž°ã®ãã³ã«åŒã¶ãš
+ O(n log n) ã®ã¡ã¢ãªã䜿ããããããæ¬å®è£
ã§ã¯ã€ã³ããã¯ã¹
+ lo/hi
+ ãæž¡ãããšã§ãã®ã³ã¹ãã O(1) ã«æããŠããŸãã
+ None
+ ã®ããŒããæšã®æ«ç«¯ã圢æããŸããæ¬åã§ã¯1èŠçŽ ã®åºéïŒlo=hiïŒããäœãããããŒããèããŒãã«ãªããŸãïŒå·Šå³ã®åããšãã«ç©ºåºéãšããŠ
+ None
+ ãè¿ãïŒã
+ + ããã ã¢ããDFSïŒçªå µå€-1ïŒã«ãã O(n) å®è£ +
++ ð¡ + ãã®åé¡ãäžèšã§èšããšïŒãæšã®ãã¹ãŠã®ããŒãã§ãå·Šå³ã®æã®æ·±ãã®å·®ã1以å ãã©ãããå€å®ããåé¡ã +
++ é«ãåè¡¡äºåæšïŒheight-balanced binary + treeïŒãšã¯ãå šããŒãã§å·Šå³ã®éšåæšã®é«ãã®å·®ãæå€§1ã§ãããããªäºåæšã§ãã + ç©ºã®æšïŒroot = nullïŒãé«ãåè¡¡ãšããŠæ±ããŸãã +
++ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
++ 3 + / \ + 9 20 + / \ + 15 7+
+ å šããŒãã§å·Šå³ã®é«ãã®å·® †1 â + true +
++ 1 + / \ + 2 2 + / \ + 3 3 +/ \ +4 4+
+ ã«ãŒãã®å·Šå³ã®é«ãå·® = 2 â + false +
++ïŒç©ºã®æšïŒ +root = null+
+ ç©ºã®æšã¯å®çŸ©äž åè¡¡ â + true +
++ ð§ è§£æ³ã®ã¢ã€ãã¢ïŒ1ãã¹ã§é«ãèšç®ãšåè¡¡ãã§ãã¯ãåæã«è¡ã +
++ èããŒãïŒåã®ãªãããŒãïŒããæ ¹ããŒãã«åãã£ãŠããã®ãŒããªããïŒããã ã¢ããïŒãé«ããè¿ãã€ã€åæã«åè¡¡ãã§ãã¯ãè¡ããŸãã + äžåè¡¡ãèŠã€ãã£ãã + -1ïŒçªå µå€ïŒãè¿ããäžäœããŒããžäŒæãããŸãã + ããã«ããåããŒããã¡ããã©1åã ã蚪åãã O(n) ãå®çŸã§ããŸãã +
++ åã¹ããããã¯ãªãã¯ããã â¶ Play ã§èªååçã§ããŸãã +
+ ++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+from typing import Optional
+
+class Solution:
+ def isBalanced(self, root: Optional[TreeNode]) -> bool:
+
+ def check_height(node: Optional[TreeNode]) -> int:
+ # ããŒã¹ã±ãŒã¹ïŒç©ºã®ããŒãã¯é«ã0
+ # `is None` ã¯PEP 8æšå¥šãNone ã¯ã·ã³ã°ã«ãã³ãªã®ã§ is ãæ£ç¢º
+ if node is None:
+ return 0
+
+ # å·ŠãµãããªãŒã®é«ããååž°ã§ååŸ
+ left_height = check_height(node.left)
+ # å·Šã -1ïŒäžåè¡¡æ€ç¥æžã¿ïŒãªãå³åº§ã« -1 ãè¿ãïŒæ©æãªã¿ãŒã³ïŒ
+ if left_height == -1:
+ return -1
+
+ # å³ãµãããªãŒã®é«ããååž°ã§ååŸ
+ right_height = check_height(node.right)
+ # å³ã -1 ã®ãšããåæ§ã«äŒæ
+ if right_height == -1:
+ return -1
+
+ # ãã®ããŒãã§ã®åè¡¡ãã§ãã¯
+ # abs() ã¯Cå®è£
ã®çµã¿èŸŒã¿é¢æ°ã§é«é
+ if abs(left_height - right_height) > 1:
+ return -1 # çªå
µå€ -1 ãè¿ããŠäžåè¡¡ãäžäœãžç¥ããã
+
+ # ãã®ããŒãã®é«ã = max(å·Š, å³) + èªåã®1
+ # max() ãCå®è£
ã®çµã¿èŸŒã¿é¢æ°ã§é«é
+ return max(left_height, right_height) + 1
+
+ # check_height ã -1 ã§ãªããã°åè¡¡ããŠãã
+ return check_height(root) != -1
+
+ + â¶ å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®åäœãã¬ãŒã¹ +
++check_height(3) éå§ + ââ check_height(9) â left=0, right=0, diff=0 †1 â return 1 + â left_height=1 (â -1ãç¶ç¶) + ââ check_height(20) éå§ + â ââ check_height(15) â return 1 + â â left_height=1 (â -1ãç¶ç¶) + â ââ check_height(7) â return 1 + â â right_height=1 (â -1ãç¶ç¶) + â ââ abs(1-1)=0 †1 â return max(1,1)+1 = 2 + â right_height=2 (â -1ãç¶ç¶) + ââ abs(1-2)=1 †1 â return max(1,2)+1 = 3 + +check_height(root) = 3 +3 != -1 â isBalanced = True â+
+ â¶ äžåè¡¡ã±ãŒã¹ [1,2,2,3,3,null,null,4,4] ã§ã®åäœãã¬ãŒã¹ +
++check_height(4) â 1 (å·Šã®4) +check_height(4) â 1 (å³ã®4) +check_height(3) [å·Š] â abs(1-1)=0 â return 2 +check_height(3) [å³] â abs(0-0)=0 â return 1 +check_height(2) [å·Š] â abs(2-1)=1 †1 â return 3 +check_height(2) [å³] â return 1 +check_height(1) [ã«ãŒã] + left_height=3, right_height=1 + abs(3-1) = 2 > 1 â return -1 â äžåè¡¡ïŒ + +check_height(root) = -1 +-1 == -1 â isBalanced = False â+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®ãããŒè¿œè·¡ +
++ ð Big-O èšæ³ã®èªã¿æ¹ïŒn = + ããŒãæ°ã倧ãããªãã«ã€ããŠåŠçæéãã©ãå¢ãããã®ç®å®ïŒ +
+| + ã¢ãããŒã + | ++ æéèšç®é + | ++ 空éèšç®é + | ++ åè + | +
|---|---|---|---|
| + â ããã ã¢ããDFSïŒçªå µå€-1ïŒ + | ++ O(n) + | ++ O(h) + | ++ åããŒãã1åã ã蚪åãh=æšã®é«ãïŒåè¡¡æšã§ã¯O(log + n)ãææªO(n)ïŒ + | +
| + â ãããããŠã³ååž°ïŒçŽ æŽïŒ + | ++ O(n²) + | ++ O(h) + | ++ é«ãèšç®ãšåè¡¡ãã§ãã¯ãåé¢ããããåãããŒããç¹°ãè¿ã蚪åããŠããŸã + | +
| + BFSïŒå¹ åªå æ¢çŽ¢ïŒ + | ++ O(n) + | ++ O(n) + | ++ dequeã®ã¡ã¢ãªç¢ºä¿ã³ã¹ãããããå®è£ ãè€éã«ãªãããã + | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ æéèšç®é O(n)ïŒcheck_height
+ ã¯ãã¹ãŠã®ããŒããã¡ããã©1åã ã蚪åããŸããäžåè¡¡ãèŠã€ãã£ãç¬éã« -1
+ ãè¿ãæ©æãªã¿ãŒã³ã«ãããç¡é§ãªååž°åŒã³åºããçããŠããŸãã
+ 空éèšç®é O(h)ïŒååž°åŒã³åºãã®ã³ãŒã«ã¹ã¿ãã¯ãæšã®é«ã h
+ åã ãç©ã¿éãªããŸããåè¡¡æšã§ã¯ h = O(log n)ãææªã®äžçŽç·ã®æšã§ã¯ h = O(n)
+ ã«ãªããŸãã
+
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ããã +
+node is None
+ ãããŒã¹ã±ãŒã¹ã§ãé«ã0ãè¿ããŸãã
+ return
+ ããŠåŠçãçµããææ³ã§ããäžåè¡¡ã確å®ããæç¹ã§å³ãµãããªãŒã調ã¹ãå¿
èŠããªããªããããç¡é§ãªèšç®ãçããŸãã
+ NoneãTrueãFalse
+ ãããã«ããããŸããis None
+ ã
+ == None
+ ããæ£ç¢ºã§éãçç±ã¯ãNoneãã·ã³ã°ã«ãã³ã ããã§ãã
+ + ååž° + ã€ã³ããã¯ã¹æž¡ã ã«ãã O(n) / O(log n) å®è£ +
++ ð¡ ãã®åé¡ãäžèšã§èšããš +
++ æé ãœãŒãæžã¿ãªã¹ããåãåããå·Šå³ã®éšåæšã®é«ãã®å·®ãåžžã« 1 以äžïŒïŒé«ã平衡ïŒã«ãªãäºåæ¢çŽ¢æšïŒBSTïŒã®ã«ãŒãããŒããè¿ãåé¡ã§ãããçãäžã®èŠçŽ ãæ ¹ã«ããããšããçºæ³ãæ žå¿ã§ããããååž°çã«ç¹°ãè¿ãããšã§èªç¶ã«å¹³è¡¡ãå®çŸãããŸãã +
++ â ïž ãªãåçŽãªæ¿å ¥ã§ã¯è§£ããªãã®ã +
+insert()
+ ãç¹°ãè¿ããšãæ¯åå³ã®åã«è¿œå ãããŠã竹ã®ãããªäžæ¬éã®æšãã«ãªããé«ãã
+ O(n) ã«ãªã
+ nums[:mid]
+ ã䜿ããšååž°ããšã«ãªã¹ãã³ããŒãçºçãã空éèšç®éã O(n log n)
+ ã«æªåãã
+ å ¥åºåäŸ 1
++ å ¥å: nums = [-10, -3, 0, 5, 9] +
++ åºå: [0, -3, 9, -10, null, 5] +
+
+ â é
åã®äžå€®
+ 0ïŒã€ã³ããã¯ã¹2ïŒãæ ¹ã«ããããšã§ãå·Šå³ã«å2èŠçŽ ãã€åé
ã§ããé«ã平衡ãå®çŸãããŸãã
+
å ¥åºåäŸ 2
+å ¥å: nums = [1, 3]
++ åºå: [3, 1] ãŸã㯠[1, null, 3] +
+
+ â 2èŠçŽ ã®å Žåãäžå€®ã€ã³ããã¯ã¹
+ mid = (0+1)//2 = 0
+ ãªã®ã§
+ 1
+ ãæ ¹ã«ãªããŸããã©ã¡ãã®åœ¢ãæ£è§£ãšããŠåçãããŸãã
+
ð å¶çŽ
++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+build(lo, hi)
+ ãå®çŸ©ã㊠nums ãåŒæ°ãªãã§åç
§ã§ããããã«ãã
+ lo > hi
+ ãªã
+ None
+ ãè¿ããŠååž°çµäº
+ mid = (lo + hi) // 2
+ ãèšç®ããŠæ ¹ããŒããäœæ
+ from typing import Optional
+
+# 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 sortedArrayToBST(self, nums: list[int]) -> Optional["TreeNode"]:
+ def build(lo: int, hi: int) -> Optional["TreeNode"]:
+ # ããŒã¹ã±ãŒã¹ïŒlo > hi ã®ãšã空åºé â None ãè¿ããŠååž°çµäº
+ # ãã®æ¡ä»¶ããªããšç¡éã«ãŒãã«ãªã RuntimeError ãçºçãã
+ if lo > hi:
+ return None
+
+ # äžå€®ã€ã³ããã¯ã¹ãåºé€ç®ïŒ//ïŒã§èšç®ãã
+ # ã¹ã©ã€ã¹ nums[lo:hi] ã䜿ããªãã®ã¯ãæ°ãããªã¹ãã®ã³ããŒãçºçããŠ
+ # 空éèšç®éã O(n log n) ã«æªåãããããã€ã³ããã¯ã¹ãªã O(1)ã
+ mid = (lo + hi) // 2
+
+ # äžå€®ã®å€ã§ããŒããäœæïŒãã®ããŒããçŸåšã®åºéã®ãæ ¹ãã«ãªãïŒ
+ # nums[mid] ãæ ¹ã«ããããšã§å·Šå³ã®èŠçŽ æ°ã®å·®ãåžžã« 1 以äžã«ä¿ããã
+ node = TreeNode(nums[mid])
+
+ # å·Šåå [lo, mid-1] ã§å·Šéšåæšãååž°æ§ç¯
+ # mid èªäœã¯çŸåšã®ããŒããšããŠäœ¿çšæžã¿ã®ããå«ãŸãªãïŒmid-1 ãŸã§ïŒ
+ node.left = build(lo, mid - 1)
+
+ # å³åå [mid+1, hi] ã§å³éšåæšãååž°æ§ç¯
+ node.right = build(mid + 1, hi)
+
+ # å·Šå³ã®åããŒããæ¥ç¶ããã宿ããŒããè¿ã
+ return node
+
+ # å
šäœã®ç¯å²ïŒã€ã³ããã¯ã¹ 0 ã æåŸã®ã€ã³ããã¯ã¹ïŒã§ååž°ãéå§
+ return build(0, len(nums) - 1)
+
+
+ + â¶ å ¥åäŸ nums = [-10, -3, 0, 5, 9] ã§ã®åäœãã¬ãŒã¹ +
++build(0, 4): + mid = 2 â node = TreeNode(0) â æ ¹ããŒã確å®ïŒ + node.left = build(0, 1) + mid = 0 â node = TreeNode(-10) + node.left = build(0, -1) â lo(0) > hi(-1) â None + node.right = build(1, 1) + mid = 1 â node = TreeNode(-3) â èããŒã + return TreeNode(-3) + return TreeNode(-10, left=None, right=TreeNode(-3)) + node.right = build(3, 4) + mid = 3 â node = TreeNode(5) + node.left = build(3, 2) â lo(3) > hi(2) â None + node.right = build(4, 4) + mid = 4 â node = TreeNode(9) â èããŒã + return TreeNode(9) + return TreeNode(5, left=None, right=TreeNode(9)) + +宿ãã BST: + 0 â æ ¹ïŒé åã®äžå€®ïŒ + / \ + -10 5 + \ \ + -3 9 + +é«ã: å·Š=2, å³=2 å·®=0 â é«ã平衡ïŒ+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ nums = [-10, -3, 0, 5, 9] ã§ã®ãããŒè¿œè·¡ +
+build(0, 4)
+ ãåŒã°ãã
+ mid=2, node=TreeNode(0)
+ build(0,1)
+ ã§åããããŒãååž°å®è¡ã
+ TreeNode(-10, right=TreeNode(-3))
+ ãæ§ç¯
+ build(3,4)
+ ã§
+ TreeNode(5, right=TreeNode(9))
+ ãæ§ç¯
+ TreeNode(0)
+ ãè¿ããŠçµäº
+ + ð Big-O èšæ³ã®èªã¿æ¹ïŒå ¥åãµã€ãº n + ã倧ãããªãã«ã€ããŠåŠçæéãã©ãå¢ãããã®ç®å®ïŒ +
+| + èšç®éã®çš®é¡ + | ++ æ¬å®è£ ïŒã€ã³ããã¯ã¹çïŒ + | ++ ã¹ã©ã€ã¹çïŒæ¯èŒïŒ + | +
|---|---|---|
| + æéèšç®é + | ++ O(n) + | ++ O(n log n) + | +
| + 空éèšç®éïŒè¿œå ïŒ + | ++ O(log n) + | ++ O(n log n) + | +
| + ã¹ã©ã€ã¹ã³ã㌠+ | ++ ãªã â + | ++ ããïŒæ¯åã³ããŒïŒâ + | +
| + n=10,000 æã®å垰深床 + | ++ â 14 段 + | ++ â 14 段 + | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ æéèšç®é O(n)ïŒnums
+ ã®åèŠçŽ ã¯ã¡ããã©1åã ã
+ TreeNode(nums[mid])
+ ãšããŠåŠçãããŸããn åã®èŠçŽ ãªã n
+ åã®ããŒãçæãèµ·ããããã以å€ã®åŠçïŒã€ã³ããã¯ã¹èšç®ã»ä»£å
¥ïŒã O(1)
+ ãªã®ã§å
šäœ O(n) ã§ãã
+
+ 空éèšç®é O(log n)ïŒã¹ã©ã€ã¹ã³ããŒã䜿ããªãããã远å ã¡ã¢ãªã¯ååž°ã¹ã¿ãã¯ïŒïŒé¢æ°ã®åŒã³åºãå±¥æŽãèšé²ããã¡ã¢ãªïŒã®ã¿ã§ããé«ãå¹³è¡¡ãªæšã®é«ã㯠+ logâ(n) çšåºŠãªã®ã§ãn=10,000 ã®ãšãååž°æ·±åºŠã¯æå€§ âlogâ(10000)â = 14 + 段çšåºŠãPython ã®ããã©ã«ãååž°äžéïŒ1000åïŒã«å¯ŸããŠäœè£ããããŸãã +
++ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ããã +
+lo > hiïŒæå¹ãªèŠçŽ ããªã空åºéïŒãããŒã¹ã±ãŒã¹ã§ãNone
+ ãè¿ããŸããããŒã¹ã±ãŒã¹ã¯ããã以äžå°ããåå²ã§ããªãæå°ã®åé¡ãã§ãã
+ //
+ æŒç®åã§è¡šããŸããäŸïŒ(0+4)//2 = 2ã(0+3)//2 = 1ãint((0+4)/2)
+ ãšåãçµæã§ãããCPython ã§ã¯
+ // ã¯
+ Cèšèªã¬ãã«ã®æŽæ°æŒç®ã«æé©åãããŠãããå倿ã³ã¹ãããããŸããã
+ nums[lo:hi]
+ ã®ããã«ãªã¹ãã®äžéšãåãåºãæäœãPython
+ ã§ã¯æ°ãããªã¹ããªããžã§ã¯ããããŒãïŒåçã¡ã¢ãªé åïŒã«çæãããŸããååž°ã®ãã³ã«åŒã¶ãš
+ O(n log n) ã®ã¡ã¢ãªã䜿ããããããæ¬å®è£
ã§ã¯ã€ã³ããã¯ã¹
+ lo/hi
+ ãæž¡ãããšã§ãã®ã³ã¹ãã O(1) ã«æããŠããŸãã
+ None
+ ã®ããŒããæšã®æ«ç«¯ã圢æããŸããæ¬åã§ã¯1èŠçŽ ã®åºéïŒlo=hiïŒããäœãããããŒããèããŒãã«ãªããŸãïŒå·Šå³ã®åããšãã«ç©ºåºéãšããŠ
+ None
+ ãè¿ãïŒã
+ + ããã ã¢ããDFSïŒçªå µå€-1ïŒã«ãã O(n) å®è£ +
++ ð¡ + ãã®åé¡ãäžèšã§èšããšïŒãæšã®ãã¹ãŠã®ããŒãã§ãå·Šå³ã®æã®æ·±ãã®å·®ã1以å ãã©ãããå€å®ããåé¡ã +
++ é«ãåè¡¡äºåæšïŒheight-balanced binary + treeïŒãšã¯ãå šããŒãã§å·Šå³ã®éšåæšã®é«ãã®å·®ãæå€§1ã§ãããããªäºåæšã§ãã + ç©ºã®æšïŒroot = nullïŒãé«ãåè¡¡ãšããŠæ±ããŸãã +
++ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
++ 3 + / \ + 9 20 + / \ + 15 7+
+ å šããŒãã§å·Šå³ã®é«ãã®å·® †1 â + true +
++ 1 + / \ + 2 2 + / \ + 3 3 +/ \ +4 4+
+ ã«ãŒãã®å·Šå³ã®é«ãå·® = 2 â + false +
++ïŒç©ºã®æšïŒ +root = null+
+ ç©ºã®æšã¯å®çŸ©äž åè¡¡ â + true +
++ ð§ è§£æ³ã®ã¢ã€ãã¢ïŒ1ãã¹ã§é«ãèšç®ãšåè¡¡ãã§ãã¯ãåæã«è¡ã +
++ èããŒãïŒåã®ãªãããŒãïŒããæ ¹ããŒãã«åãã£ãŠããã®ãŒããªããïŒããã ã¢ããïŒãé«ããè¿ãã€ã€åæã«åè¡¡ãã§ãã¯ãè¡ããŸãã + äžåè¡¡ãèŠã€ãã£ãã + -1ïŒçªå µå€ïŒãè¿ããäžäœããŒããžäŒæãããŸãã + ããã«ããåããŒããã¡ããã©1åã ã蚪åãã O(n) ãå®çŸã§ããŸãã +
++ åã¹ããããã¯ãªãã¯ããã â¶ Play ã§èªååçã§ããŸãã +
+ ++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+from typing import Optional
+
+class Solution:
+ def isBalanced(self, root: Optional[TreeNode]) -> bool:
+
+ def check_height(node: Optional[TreeNode]) -> int:
+ # ããŒã¹ã±ãŒã¹ïŒç©ºã®ããŒãã¯é«ã0
+ # `is None` ã¯PEP 8æšå¥šãNone ã¯ã·ã³ã°ã«ãã³ãªã®ã§ is ãæ£ç¢º
+ if node is None:
+ return 0
+
+ # å·ŠãµãããªãŒã®é«ããååž°ã§ååŸ
+ left_height = check_height(node.left)
+ # å·Šã -1ïŒäžåè¡¡æ€ç¥æžã¿ïŒãªãå³åº§ã« -1 ãè¿ãïŒæ©æãªã¿ãŒã³ïŒ
+ if left_height == -1:
+ return -1
+
+ # å³ãµãããªãŒã®é«ããååž°ã§ååŸ
+ right_height = check_height(node.right)
+ # å³ã -1 ã®ãšããåæ§ã«äŒæ
+ if right_height == -1:
+ return -1
+
+ # ãã®ããŒãã§ã®åè¡¡ãã§ãã¯
+ # abs() ã¯Cå®è£
ã®çµã¿èŸŒã¿é¢æ°ã§é«é
+ if abs(left_height - right_height) > 1:
+ return -1 # çªå
µå€ -1 ãè¿ããŠäžåè¡¡ãäžäœãžç¥ããã
+
+ # ãã®ããŒãã®é«ã = max(å·Š, å³) + èªåã®1
+ # max() ãCå®è£
ã®çµã¿èŸŒã¿é¢æ°ã§é«é
+ return max(left_height, right_height) + 1
+
+ # check_height ã -1 ã§ãªããã°åè¡¡ããŠãã
+ return check_height(root) != -1
+
+ + â¶ å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®åäœãã¬ãŒã¹ +
++check_height(3) éå§ + ââ check_height(9) â left=0, right=0, diff=0 †1 â return 1 + â left_height=1 (â -1ãç¶ç¶) + ââ check_height(20) éå§ + â ââ check_height(15) â return 1 + â â left_height=1 (â -1ãç¶ç¶) + â ââ check_height(7) â return 1 + â â right_height=1 (â -1ãç¶ç¶) + â ââ abs(1-1)=0 †1 â return max(1,1)+1 = 2 + â right_height=2 (â -1ãç¶ç¶) + ââ abs(1-2)=1 †1 â return max(1,2)+1 = 3 + +check_height(root) = 3 +3 != -1 â isBalanced = True â+
+ â¶ äžåè¡¡ã±ãŒã¹ [1,2,2,3,3,null,null,4,4] ã§ã®åäœãã¬ãŒã¹ +
++check_height(4) â 1 (å·Šã®4) +check_height(4) â 1 (å³ã®4) +check_height(3) [å·Š] â abs(1-1)=0 â return 2 +check_height(3) [å³] â abs(0-0)=0 â return 1 +check_height(2) [å·Š] â abs(2-1)=1 †1 â return 3 +check_height(2) [å³] â return 1 +check_height(1) [ã«ãŒã] + left_height=3, right_height=1 + abs(3-1) = 2 > 1 â return -1 â äžåè¡¡ïŒ + +check_height(root) = -1 +-1 == -1 â isBalanced = False â+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®ãããŒè¿œè·¡ +
++ ð Big-O èšæ³ã®èªã¿æ¹ïŒn = + ããŒãæ°ã倧ãããªãã«ã€ããŠåŠçæéãã©ãå¢ãããã®ç®å®ïŒ +
+| + ã¢ãããŒã + | ++ æéèšç®é + | ++ 空éèšç®é + | ++ åè + | +
|---|---|---|---|
| + â ããã ã¢ããDFSïŒçªå µå€-1ïŒ + | ++ O(n) + | ++ O(h) + | ++ åããŒãã1åã ã蚪åãh=æšã®é«ãïŒåè¡¡æšã§ã¯O(log + n)ãææªO(n)ïŒ + | +
| + â ãããããŠã³ååž°ïŒçŽ æŽïŒ + | ++ O(n²) + | ++ O(h) + | ++ é«ãèšç®ãšåè¡¡ãã§ãã¯ãåé¢ããããåãããŒããç¹°ãè¿ã蚪åããŠããŸã + | +
| + BFSïŒå¹ åªå æ¢çŽ¢ïŒ + | ++ O(n) + | ++ O(n) + | ++ dequeã®ã¡ã¢ãªç¢ºä¿ã³ã¹ãããããå®è£ ãè€éã«ãªãããã + | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ æéèšç®é O(n)ïŒcheck_height
+ ã¯ãã¹ãŠã®ããŒããã¡ããã©1åã ã蚪åããŸããäžåè¡¡ãèŠã€ãã£ãç¬éã« -1
+ ãè¿ãæ©æãªã¿ãŒã³ã«ãããç¡é§ãªååž°åŒã³åºããçããŠããŸãã
+ 空éèšç®é O(h)ïŒååž°åŒã³åºãã®ã³ãŒã«ã¹ã¿ãã¯ãæšã®é«ã h
+ åã ãç©ã¿éãªããŸããåè¡¡æšã§ã¯ h = O(log n)ãææªã®äžçŽç·ã®æšã§ã¯ h = O(n)
+ ã«ãªããŸãã
+
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ããã +
+node is None
+ ãããŒã¹ã±ãŒã¹ã§ãé«ã0ãè¿ããŸãã
+ return
+ ããŠåŠçãçµããææ³ã§ããäžåè¡¡ã確å®ããæç¹ã§å³ãµãããªãŒã調ã¹ãå¿
èŠããªããªããããç¡é§ãªèšç®ãçããŸãã
+ NoneãTrueãFalse
+ ãããã«ããããŸããis None
+ ã
+ == None
+ ããæ£ç¢ºã§éãçç±ã¯ãNoneãã·ã³ã°ã«ãã³ã ããã§ãã
+ + BFS + collections.deque ã«ãã O(n) å®è£ +
++ ð¡ + äžèšã§èšããšïŒãæšãäžããäžãžãåãé«ãã®ããŒãããŸãšããŠã°ã«ãŒãåããåé¡ã +
+ð¡ ãã®åé¡ãäžèšã§èšããšïŒ
+
+ ãæšã®åãæ·±ãïŒéå±€ïŒã«ããããŒããå
šéšéããŠ1ã€ã®ãªã¹ãã«ãŸãšãããããæ·±ãé ã«äžŠã¹ã2次å
é
åãè¿ãåé¡ãã§ãã
+ å·Šããå³ã®é çªã§ããŒããéããå¿
èŠããããŸãã
+
+ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
+list.pop(0)
+ ã䜿ããšå
é åé€ã O(n) ã«ãªãå
šäœã O(n²) ãžæªåãã
+ 0
+ ã®ãšããor
+ ããªãã¯ã¯
+ 0ïŒfalsyïŒãšèª€å€å®ããŠå£ãã
+ ð¥ å ¥åºåäŸ
+å ¥åïŒããªãŒïŒ
++ 3 + / \ + 9 20 + / \ + 15 7+
åºåãšçç±
++[[3],[9,20],[15,7]] + +æ·±ã0 â [3] +æ·±ã1 â [9, 20] â å·Šããå³ +æ·±ã2 â [15, 7] â å·Šããå³+
ð å¶çŽ
++ åã¹ããããã¯ãªãã¯ããããâ¶ Play ãã¿ã³ã§èªååçã§ããŸãã +
+ ++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+from collections import deque
+from typing import Optional
+
+
+class Solution:
+ def levelOrder(self, root: Optional[TreeNode]) -> list[list[int]]:
+ # åºåºæ¡ä»¶: root ã NoneïŒç©ºããªãŒïŒãªãå³åº§ã«ç©ºãªã¹ããè¿ã
+ # None ãã§ãã¯ãããªããšåŸç¶ã® node.val ã¢ã¯ã»ã¹ã§ã¯ã©ãã·ã¥ãã
+ if root is None:
+ return []
+
+ result: list[list[int]] = []
+
+ # collections.deque ããã¥ãŒãšããŠäœ¿ã
+ # list.pop(0) 㯠O(n) ã ã deque.popleft() 㯠O(1)
+ # deque 㯠Cèšèªå®è£
ã®åæ¹åãã¥ãŒã§å
é ã»æ«å°Ÿãžã®æäœãé«é
+ queue: deque[TreeNode] = deque([root])
+
+ # ãã¥ãŒã空ã«ãªããŸã§ã«ãŒãïŒ= å
šããŒããåŠçãçµãããŸã§ïŒ
+ while queue:
+ # ââ BFS ã®æ žå¿ïŒä»ã®éã®ãµã€ãºãããã§åºå®ãã ââ
+ # ã«ãŒãäžã« popleft()/append() ã§ queue ã®é·ããå€åãããã
+ # å
ã«å€æ°ãžä¿åããªããšãä»ã®éãã®ç¯å²ããã㊠Wrong Answer ã«ãªã
+ level_size: int = len(queue)
+ level_values: list[int] = []
+
+ for _ in range(level_size):
+ # popleft() ã§ãã¥ãŒã®å
é ããŒãã O(1) ã§åãåºã
+ node: TreeNode = queue.popleft()
+
+ # val ãçŽæ¥ append ããïŒ0 ãæ£ãã远å ãããïŒ
+ # `or` ããªãã¯ã¯ val=0 ã®ãšã falsy ãšå€å®ãããŠå£ãããã䜿ããªã
+ level_values.append(node.val)
+
+ # åãååšããå Žåã®ã¿ãã¥ãŒãžè¿œå ïŒæ¬¡ã®éã®æºåïŒ
+ if node.left is not None:
+ queue.append(node.left)
+ if node.right is not None:
+ queue.append(node.right)
+
+ result.append(level_values)
+
+ return result
+
+ + â¶ å ¥åäŸ [3, 9, 20, null, null, 15, 7] ã§ã®åäœãã¬ãŒã¹ +
++åæç¶æ : queue = deque([Node(3)]), result = [] + +ââ ã«ãŒã 1åç®ïŒæ·±ã0ïŒ ââ + level_size = 1 â ããã§åºå®ïŒ + vals = [] + i=0: popleft() â Node(3) queue = deque([]) + append(3) â vals = [3] + left=Node(9) â queue = deque([Node(9)]) + right=Node(20) â queue = deque([Node(9), Node(20)]) + result = [[3]] + +ââ ã«ãŒã 2åç®ïŒæ·±ã1ïŒ ââ + level_size = 2 â ããã§åºå®ïŒ + i=0: Node(9) â vals=[9] åãªã + i=1: Node(20) â vals=[9,20] left=Node(15), right=Node(7) + result = [[3], [9, 20]] + +ââ ã«ãŒã 3åç®ïŒæ·±ã2ïŒ ââ + level_size = 2 + i=0: Node(15) â vals=[15] åãªã + i=1: Node(7) â vals=[15,7] åãªã + result = [[3], [9, 20], [15, 7]] + +queue ã空 â ã«ãŒãçµäº +æ»ãå€: [[3], [9, 20], [15, 7]] â+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ïŒMermaid èšæ³ïŒ +
++ ð å ¥åäŸ [3, 9, 20, null, null, 15, 7] ã§ã®ãããŒè¿œè·¡ +
++ ð Big-O èšæ³ã®èªã¿æ¹ïŒn = ããŒãæ°ïŒ +
+| çš®å¥ | +èšç®é | +çç± | +
|---|---|---|
| æéèšç®é | +O(n) | ++ åããŒãã popleft() ã§1åã ãåŠçïŒO(1)ÃnåïŒ + | +
| 空éèšç®é | +O(n) | ++ ãã¥ãŒã«æå€§ã§æäžå±€ã®ããŒãæ°ïŒæå€§ n/2 åïŒãå ¥ã + | +
| + æ¯èŒïŒlist.pop(0) + | +O(n²) | ++ å é åé€ã®ãã³ã«æ®ãå šèŠçŽ ãã·ããïŒO(n)ÃnåïŒ + | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ å
šããŒãæ°ã n ãšãããšãåããŒãã¯ãã¥ãŒãžã®
+ append()ïŒO(1)ïŒãš
+ popleft()ïŒO(1)ïŒã1åãã€è¡ãããã åèšæäœåæ°ã¯ 2n =
+ O(n) ã§ãã 空éã«ã€ããŠã¯ãå®å
šäºåæšã®æäžå±€ã«æå€§ n/2
+ åã®ããŒããéãŸãããã ãã¥ãŒã®æå€§ãµã€ãºã¯ O(n) ãšãªããŸãã
+ ããã¯åºåé
å result ã®ãµã€ãºãåæ§ã§ãå
šããŒãã®å€ãæ ŒçŽãããã O(n)
+ ã§ãã
+
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ããã +
+collections.deque
+ ã®ããšã Doubly-Ended QueueïŒäž¡ç«¯ãã¥ãŒïŒã®ç¥ãåãããåŸãããã O(1)
+ ã§åºãå
¥ãã§ããã䞡端éãã®ç®±ãã Python ã®
+ list
+ ã®å
é åé€ã¯ O(n) ã ãã deque ã®
+ popleft() ã¯
+ O(1)ã Cèšèªã§å®è£
ãããŠããé«éã
+ if
+ ã®æ¡ä»¶åŒã§
+ False
+ çžåœãšèŠãªãããå€ã
+ 0ãNoneã[]ã""
+ ãªã©ã該åœããã ããŒãã®å€
+ val = 0 ã¯
+ falsy ãªã®ã§ã
+ 0 or åŒ
+ ãšããæžãæ¹ã¯ã0ã®ãšãå³èŸºãå®è¡ããããšãã誀åäœãåŒãèµ·ããã
+ level_size = len(queue)
+ ã§ ãä»ã®éã®ããŒãæ°ãã倿°ã«ä¿åãããã¯ããã¯ã ã«ãŒãäžã«åã®è¿œå ã§
+ queue ã®é·ããå€åãããããå
ã«åºå®ããªããš
+ ãä»ã®éããšã次ã®éãã®å¢çãæ··åšã㊠Wrong Answer ã«ãªãã
+ deque
+ ã®å
é èŠçŽ ã O(1) ã§åãåºãã¡ãœããã
+ list.pop(0)
+ ã¯æ®ãå
šèŠçŽ ãåã«ã·ãããããã O(n) ããããã
+ deque.popleft()
+ ã¯åæ¹åé£çµãªã¹ãã®å
é ãã€ã³ã¿ã1ã€é²ããã ããªã®ã§ O(1)ã n=2000
+ ã®ãšãããã®å·®ã¯ 2000 å vs æå€§ 4,000,000 åã®æäœå·®ã«ãªãã
+ + BFSïŒå¹ åªå æ¢çŽ¢ïŒ+ å¶å¥å転㧠O(n) å®è£ +
+ ++ ð¡ äžèšã§èšããšïŒãäºåæšãéå±€ããšã«ãå¶æ°éå±€ã¯å·Šâå³ã»å¥æ°éå±€ã¯å³âå·Šãš + 亀äºã«ãžã°ã¶ã° ã§å€ãåéããåé¡ã +
+ + ++ ð¡ + ãã®åé¡ãäžèšã§èšããšïŒãäºåæšãéå±€ããšã«èªã¿åãã1éå±€ããã«èªãåããå転ãããåé¡ã +
++ æšã®åéå±€ïŒã¬ãã«ïŒããã¥ãŒïŒåŸ ã¡è¡åïŒã§é çªã«åŠçããå¶æ°çªç®ã®éå±€ã¯å·Šâå³ã奿°çªç®ã®éå±€ã¯å³âå·Šã®é ã§å€ãåéããŸãã + æçµçã«åéå±€ã®å€ãªã¹ãã2次å é åãšããŠè¿ããŸãã +
++ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
+level_size
+ ãäºåã«åºå®ããã®ãéµã§ãã
+ list
+ ã
+ deque
+ ãïŒãããã©ãŒãã³ã¹ã«çŽçµããŸãã
+ äŸ 1
++ éå±€0â[3]ïŒå·Šâå³ïŒãéå±€1â[20,9]ïŒå³âå·Šã«å転ïŒãéå±€2â[15,7]ïŒå·Šâå³ïŒ +
+äŸ 2
++ ããŒãã1ã€ã ããªã®ã§ããã®ãŸãŸ[[1]]ãè¿ãã +
+äŸ 3
++ ã¬ãŒãç¯ïŒroot is NoneïŒã§å³åº§ã«ç©ºãªã¹ããè¿ãã +
+ð å¶çŽ
+root ã¯
+ None
+ ã®å ŽåããïŒç©ºããªãŒïŒ
+ + ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+root is None
+ ãªãå³
+ [] ãè¿ã
+ collections.deque
+ ã«ã«ãŒãããŒããå
¥ããŠãã¥ãŒãåæåãã
+ while queue:
+ ã§éå±€ã«ãŒã â
+ level_size
+ ãåºå®ããŠããå
åŽã«ãŒããž
+ from __future__ import annotations
+from typing import TYPE_CHECKING, Optional
+from collections import deque
+
+if TYPE_CHECKING:
+ class TreeNode:
+ val: int
+ left: Optional[TreeNode]
+ right: Optional[TreeNode]
+ def __init__(self, val=0, left=None, right=None) -> None: ...
+
+
+class Solution:
+ def zigzagLevelOrder(self, root: Optional[TreeNode]) -> list[list[int]]:
+ # ââ ã¬ãŒãç¯ ââââââââââââââââââââââââââââââââââââââââââââââ
+ # root ã NoneïŒç©ºããªãŒïŒãªãå³åº§ã«ç©ºãªã¹ããè¿ãã
+ # åŸç¶åŠçã§ node.val ãžã¢ã¯ã»ã¹ã㊠AttributeError ãèµ·ããã®ãé²ãã
+ if root is None:
+ return []
+
+ result: list[list[int]] = []
+
+ # ââ dequeïŒäž¡ç«¯ãã¥ãŒïŒã®åæå âââââââââââââââââââââââââââ
+ # list.pop(0) 㯠O(n)ãdeque.popleft() 㯠O(1)ã
+ # å
šããŒãåç¹°ãè¿ããš list ã§ã¯ O(n²) ã«ãªã£ãŠããŸãã
+ queue: deque[TreeNode] = deque([root])
+
+ # ââ BFS ã¡ã€ã³ã«ãŒã ââââââââââââââââââââââââââââââââââââââ
+ while queue:
+ # ãä»ã®éå±€ã®ããŒãæ°ããããã§åºå®ããã
+ # ã«ãŒãäžã«åããŒãããã¥ãŒãžè¿œå ãããããåºå®ããªããš
+ # ä»ã®éå±€ãšæ¬¡ã®éå±€ã®å¢çã厩ããŠããŸãã
+ level_size: int = len(queue)
+ level_values: list[int] = []
+
+ for _ in range(level_size):
+ # deque ã®å
é ãã O(1) ã§åãåºã
+ node: TreeNode = queue.popleft()
+ level_values.append(node.val)
+
+ if node.left is not None:
+ queue.append(node.left)
+ if node.right is not None:
+ queue.append(node.right)
+
+ # ââ ãžã°ã¶ã°åŠçïŒå¶å¥ã«ããæ¹ååãæ¿ãïŒââââââââââââââ
+ # len(result) == ãå®äºæžã¿éå±€æ°ã == ãçŸåšã®éå±€çªå·ã
+ # å¶æ°ïŒ0,2,4âŠïŒâ å·Šâå³ïŒãã®ãŸãŸè¿œå ïŒ
+ # 奿°ïŒ1,3,5âŠïŒâ å³âå·ŠïŒin-place ã§éé ã«ããïŒ
+ # list.reverse() ã¯æ°ãããªã¹ããäœããªã in-place æäœãªã®ã§
+ # [::-1] ããã¡ã¢ãªå¹çã»é床ãšãã«åªããã
+ if len(result) % 2 == 1:
+ level_values.reverse()
+
+ result.append(level_values)
+
+ return result
+
+
+ + â¶ å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®åäœãã¬ãŒã¹ +
++åæç¶æ : + queue = deque([Node(3)]) + result = [] + +â éå±€ 0ïŒlen(result)=0 â å¶æ° â ãã®ãŸãŸïŒâââââââââââââââââ + level_size = 1 + popleft() â Node(3) â level_values = [3] + â Node(9) ãš Node(20) ããã¥ãŒãžè¿œå + 0 % 2 == 0 â reverse ããªã + result = [[3]] queue = deque([Node(9), Node(20)]) + +â éå±€ 1ïŒlen(result)=1 â 奿° â éé ïŒââââââââââââââââââââââ + level_size = 2 + popleft() â Node(9) â level_values = [9] ïŒåãªãïŒ + popleft() â Node(20) â level_values = [9, 20] + â Node(15) ãš Node(7) ããã¥ãŒãžè¿œå + 1 % 2 == 1 â reverse() â level_values = [20, 9] + result = [[3],[20,9]] queue = deque([Node(15), Node(7)]) + +â éå±€ 2ïŒlen(result)=2 â å¶æ° â ãã®ãŸãŸïŒâââââââââââââââââ + level_size = 2 + popleft() â Node(15) â level_values = [15] ïŒåãªãïŒ + popleft() â Node(7) â level_values = [15, 7] ïŒåãªãïŒ + 2 % 2 == 0 â reverse ããªã + result = [[3],[20,9],[15,7]] queue = deque([]) â 空 + +while queue: â False â ã«ãŒãçµäº +æçµåºå: [[3], [20, 9], [15, 7]] â+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®ãããŒè¿œè·¡ +
+return [[3],[20,9],[15,7]]
+ â
+ + ð Big-O èšæ³ã®èªã¿æ¹ïŒå ¥åãµã€ãº n + ã倧ãããªãã«ã€ããŠåŠçæéãã©ãå¢ãããã®ç®å®ïŒ +
+| + çš®å¥ + | +èšç®é | ++ çç± + | +
|---|---|---|
| æéèšç®é | ++ O(n) + | +
+ å
šããŒããäžåºŠã ã蚪åãããreverse()
+ ã¯åéå±€ãµã€ãº k ã«å¯Ÿã㊠O(k) ã ããå
šéå±€ãåèšãããš O(n)
+ |
+
| 空éèšç®é | ++ O(n) + | ++ deque + ã¯æå€§ã§æãå¹ ã®åºãéå±€ã®ããŒãæ°ãæ ŒçŽãããå®å šäºåæšã§ã¯æå€§ + n/2 ããŒããresult ãªã¹ããæçµçã« n ããŒãåãæ ŒçŽãã + | +
| æäœ | +ã³ãŒã | +远å ã¡ã¢ãª | +é床 | +
|---|---|---|---|
| + â in-placeïŒæ¡çšïŒ + | +level.reverse() | +O(1)ïŒãªãïŒ | +é«éïŒCå®è£ ïŒ | +
| â PureïŒäžæ¡çšïŒ | +level[::-1] | +O(k)ïŒæ°ãªã¹ãçæïŒ | +ããäœé | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ BFS
+ ã§ã¯åããŒãããã¥ãŒãã1åã ãåãåºãããã®å€ãåéããŠåããŒãã远å ããŸãã
+ ããŒãæ°ã n ãšãããšãpopleftã»appendã»level_values.append ã¯ãã¹ãŠ O(1)
+ ãªã®ã§åèš O(n)ã
+ reverse()
+ ã¯åéå±€ã®ãµã€ãº k ã«å¯Ÿã㊠O(k) ã§ããã
+ ãã¹ãŠã®éå±€ã®ãµã€ãºã®åèšã¯ã¡ããã© n ã«ãªããããå
šäœã§ã O(n)
+ ã«åãŸããŸãã 空éã«ã€ããŠã¯ãdeque
+ ã«åæã«å
¥ãããŒãã¯ãæãå¹
ã®åºãéå±€ãã ããªã®ã§æå€§ O(n/2) = O(n) ã§ãã
+
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ããã +
+collections.deque
+ ãæäŸããããŒã¿æ§é ãå
é ã»æ«å°Ÿãžã®è¿œå ã»åãåºããã©ã¡ãã
+ O(1)ïŒäžå®æéïŒã§è¡ãããlist ã§
+ pop(0)ïŒå
é åãåºãïŒããããš O(n) ããããããBFS ãã¥ãŒã«ã¯å¿
ã deque
+ ã䜿ãã
+ return
+ ããæžãæ¹ãif root is None: return []
+ ãããã«ãããã
+ list.reverse()
+ ããã®ä»£è¡šäŸãlist[::-1]
+ ã¯æ°ãããªã¹ããçæããïŒPure æäœïŒãin-place
+ ã®æ¹ã远å ã¡ã¢ãªãæ¶è²»ããªãåãå¹ççã
+ level_size
+ ã®åºå®ããããä¿èšŒããã
+ + ååž° DFS & å埩 BFS ã«ãã O(n) å®è£ +
++ ð¡ äžèšã§èšããšïŒãæšã®æ ¹ããäžçªé ãèãŸã§äœæ®µããããæ°ããåé¡ãã§ãã +
+ ++ ð¡ + ãã®åé¡ãäžèšã§èšããšïŒãäºåæšã®æ ¹ããäžçªé ãèãŸã§äœæ®µããããæ°ããåé¡ãã§ãã +
++ äºåæšïŒïŒåããŒããæå€§2ã€ã®åãå·Šã»å³ããæã€æšæ§é ããŒã¿ïŒã®æ ¹ïŒrootïŒããã + äžçªé ãèããŒãïŒïŒåãæããªãæ«ç«¯ããŒãïŒãŸã§ã®ããŒãæ°ãè¿ããŸãã + ãã¹ãŠã®ããŒãã1åãã€èšªåããªããã°ãªããªããããæéèšç®éã®çè«éçã¯O(n)ã§ãã +
++ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
++ å ¥åäŸ 1 +
++ 3 â æ·±ã 1 + / \ + 9 20 â æ·±ã 2 + / \ + 15 7 â æ·±ã 3 (è)+
åºå: 3
++ æ·±ã3ãŸã§èããŒããååšãããããæå€§æ·±ã=3 +
++ å ¥åäŸ 2 +
++ 1 â æ·±ã 1 + \ + 2 â æ·±ã 2 (è)+
åºå: 2
++ å³ã®åã ããååšããèã¯æ·±ã2ã«ãããããæå€§æ·±ã=2 +
++ å ¥åäŸ1ïŒroot=[3,9,20,null,null,15,7]ïŒã䜿ã£ãŠãBFSå埩çã®åãã远ããŸãã +
+ ++ 2ã€ã®å®è£ ãã¿ãŒã³ãæäŸããŸãã + æ¥åéçºçïŒBFSïŒã¯å垰深床å¶éãåé¿ããããæ¬çªç°å¢ã«é©ããŠããã + ç«¶æããã°ã©ãã³ã°çïŒååž°DFSïŒã¯æãã·ã³ãã«ã§ã³ãŒããçãå®è£ ã§ãã +
+ + ++ ð æ¥åéçºçïŒBFSïŒã®ã³ãŒãæ§é +
+from __future__ import annotations
+from typing import Optional
+from collections import deque
+
+# ââââââââââââââââââââââââââââââââââââââââââââââââ
+# æ¥åéçºçïŒå埩 BFSïŒCPython ååž°å¶éãåé¿ïŒ
+# ââââââââââââââââââââââââââââââââââââââââââââââââ
+class Solution:
+ def maxDepth(self, root: Optional[TreeNode]) -> int:
+ # ãšããžã±ãŒã¹ïŒç©ºã®æšïŒããŒãã1ã€ããªãïŒâ æ·±ã 0
+ # åŸç¶ã® deque åŠçã« None ãå
¥ããªãããã®æ©æãªã¿ãŒã³
+ if root is None:
+ return 0
+
+ # deque ã䜿ãçç±ïŒ
+ # list.pop(0) ã¯å
é åé€ã O(n) ã ã
+ # deque.popleft() 㯠O(1) ã§æžã
+ queue: deque[TreeNode] = deque([root])
+ depth: int = 0 # åŠçããã¬ãã«ã®æ° = æ·±ã
+
+ while queue:
+ # ãã®æç¹ã® len(queue) = ä»ã®ã¬ãã«ã®ããŒãæ°
+ # ã«ãŒãåã«åºå®ããããšã§ã次ã®ã¬ãã«ã®ããŒãã
+ # append ãããŠã圱é¿ãåããªããããã«ãã
+ level_size: int = len(queue)
+
+ for _ in range(level_size):
+ node: TreeNode = queue.popleft() # O(1)
+
+ # å·Šã»å³ã®åãååšããã°æ¬¡ã®ã¬ãã«ãšããŠãã¥ãŒãž
+ if node.left is not None:
+ queue.append(node.left)
+ if node.right is not None:
+ queue.append(node.right)
+
+ # ä»ã®ã¬ãã«ãå
šéšåŠçãçµãã = 1段éãã
+ depth += 1
+
+ return depth
+
+
+# ââââââââââââââââââââââââââââââââââââââââââââââââ
+# ç«¶æããã°ã©ãã³ã°çïŒååž° DFSïŒæãã·ã³ãã«ïŒ
+# ââââââââââââââââââââââââââââââââââââââââââââââââ
+class Solution2:
+ def maxDepth(self, root: Optional[TreeNode]) -> int:
+ # ããŒã¹ã±ãŒã¹ïŒNone = ååšããªãããŒãã®æ·±ã㯠0
+ # "is None" ã䜿ãçç±ïŒ
+ # éåžžã®ããŒããªããžã§ã¯ãã¯valã®å€ã«ãããããtruthyã§ããã
+ # ããŒããååšããªã(None)ããšãçåœå€ã§ã¯ãªãæç€ºçã«å€å®ããããã§ãã
+ if root is None:
+ return 0
+
+ # max() 㯠Cå®è£
ã®çµã¿èŸŒã¿é¢æ°ãªã®ã§ ifæããé«é
+ # ãå·Šã®æ·±ãããšãå³ã®æ·±ããã®å€§ããæ¹ + çŸåšããŒãå(+1)
+ return 1 + max(
+ self.maxDepth(root.left),
+ self.maxDepth(root.right),
+ )
+
+
+ + â¶ å ¥åäŸ1 [3,9,20,null,null,15,7] ã§ã®åäœãã¬ãŒã¹ïŒBFSçïŒ +
++åæç¶æ : queue=deque([Node(3)]), depth=0 + +ãã¬ãã«1ãlevel_size=1 + popleft() â Node(3) + left=Node(9) â append â queue=[Node(9)] + right=Node(20) â append â queue=[Node(9),Node(20)] + depth=1 + +ãã¬ãã«2ãlevel_size=2 + popleft() â Node(9) + left=None, right=None â 远å ãªã + popleft() â Node(20) + left=Node(15) â append â queue=[Node(15)] + right=Node(7) â append â queue=[Node(15),Node(7)] + depth=2 + +ãã¬ãã«3ãlevel_size=2 + popleft() â Node(15) â åãªã + popleft() â Node(7) â åãªã + depth=3 + +queue=deque([]) â 空 â ã«ãŒãçµäº +return 3 â+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ1 [3,9,20,null,null,15,7] ã§ã®ãããŒè¿œè·¡ +
++ ð Big-O èšæ³ã®èªã¿æ¹ïŒn ã倧ãããªãã«ã€ããŠåŠçæéãã©ãå¢ãããã®ç®å®ïŒ +
+| + å®è£ + | ++ æéèšç®é + | ++ 空éèšç®é + | ++ 空éã®è©³çް + | +
|---|---|---|---|
| + æ¥åçïŒBFSïŒ + | ++ O(n) + | ++ O(w) + | ++ w = æšã®æå€§å¹ ãå®å šäºåæšã§ã¯æäžæ®µân/2 + | +
| + ç«¶æçïŒååž°DFSïŒ + | ++ O(n) + | ++ O(h) + | ++ h = æšã®é«ãã平衡æšã§O(log n)ãäžæ¬éã§O(n) + | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ æéèšç®é O(n)ïŒãæšã®æå€§æ·±ãããæ±ããã«ã¯ãå
šããŒããå°ãªããšã1åã¯èšªåããªããã°ãªããŸããïŒã©ã®èãäžçªæ·±ããåãããªãããïŒãBFSçã»DFSçã©ã¡ããå
šnåã®ããŒããæ£ç¢ºã«1åãã€åŠçããã®ã§
+ O(n) ã§ãã
+ 空éèšç®éïŒBFSïŒO(w)ïŒãã¥ãŒã«ã¯ãçŸåšã®ã¬ãã«ã®ããŒãããšã次ã®ã¬ãã«ã®ããŒãããåæã«å
¥ããŸããåãæ·±ãã®ããŒãæ°ã®æå€§å€
+ w ãæå€§ãã¥ãŒãµã€ãºã«ãªããŸãã
+ 空éèšç®éïŒDFSïŒO(h)ïŒååž°åŒã³åºãã®ãã³ã«ã³ãŒã«ã¹ã¿ãã¯ã«1段ç©ãŸããŸããæå€§ã§ãæšã®é«ã
+ hãæ®µãŸã§ç©ãŸãããã O(h) ã§ãã
+
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ããã +
+collections.deque
+ ã䜿ã£ãŠå®è£
ããã
+ RecursionError
+ ãçºçããã
+ list.pop(0)ïŒå
é åé€ïŒã¯å
šèŠçŽ ãããããã O(n) ãããããdeque.popleft()
+ 㯠O(1) ã§æžããBFS ã®å®è£
ã«ã¯å¿
ã deque ã䜿ãã
+ Optional[TreeNode]
+ ãšæžããšãpylanceïŒåãã§ãã«ãŒïŒããNone
+ ãããããªããããšãçè§£ããNone ãã§ãã¯ãªãã«
+ root.left
+ ãžã¢ã¯ã»ã¹ãããšèŠåããŠãããã
+ root is None
+ ãããŒã¹ã±ãŒã¹ã§ããååšããªãããŒãã®æ·±ãã¯0ããæå³ãããããŒã¹ã±ãŒã¹ããªããšååž°ãç¡éã«ç¶ããŠãšã©ãŒã«ãªãã
+ + dictååŠç + ååž°åå² ã«ãã O(n) å®è£ +
+ð¡ ãã®åé¡ãäžèšã§èšããšïŒ
+ãåé æ¢çŽ¢ïŒpreorderïŒãšäžé æ¢çŽ¢ïŒinorderïŒãšãã2çš®é¡ã®é
åãããšã«ããããçæããå
ã®äºåæšã Python ã®ããŒããªããžã§ã¯ããšããŠåæ§ç¯ããåé¡ãã§ãã
+ preorder ã®å
é ã¯å¿
ãã«ãŒãã«ãªããinorder ã§ã®ã«ãŒãäœçœ®ãå·Šå³ã®åå²ç¹ãæããŠãããŸãããã®2ã€ã®æ§è³ªãçµã¿åãããããšã§æšãäžæã«åŸ©å
ã§ããŸãã
â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã
+[1,2,3] ã«å¯ŸããŠè€æ°ã®ç°ãªãäºåæšãååšããŸããå·Šå³ã©ã¡ãã®åããäžæãªããã§ããnonlocal ã®çè§£ãå¿
èŠã§ããð¥ å ¥åäŸ 1
+preorder = [3, 9, 20, 15, 7] +inorder = [9, 3, 15, 20, 7]+
â [3,9,20,null,null,15,7]
+ preorderå
é ã®3ãã«ãŒããinorderã§ã«ãŒã3ã®å·Šã¯[9]ãå³ã¯[15,20,7]ãšåããã
ð¥ å ¥åäŸ 2
+preorder = [-1] +inorder = [-1]+
â TreeNode(-1)
+ ããŒãã1ã€ã ããå·Šå³ã®åãšãNoneã
ð 2ã€ã®é åãæã€æ å ±
+ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ
+import sys
+from typing import Optional
+
+sys.setrecursionlimit(10_000) # åã£ãæš(n=3000)ã®æ·±ãååž°ã«åããŠäžéãç·©å
+
+
+class TreeNode:
+ __slots__ = ("val", "left", "right")
+ def __init__(self, val=0, left=None, right=None):
+ self.val = val
+ self.left = left
+ self.right = right
+
+
+class Solution:
+ def buildTree(
+ self,
+ preorder: list[int],
+ inorder: list[int],
+ ) -> Optional[TreeNode]:
+ """
+ preorderïŒåé ïŒãš inorderïŒäžé ïŒããäºåæšã埩å
ããã
+ Time: O(n) - åããŒããã¡ããã©1ååŠç
+ Space: O(n) - dict(n ãšã³ããª) + ååž°ã¹ã¿ãã¯(é«ã h)
+ """
+ # â åãã§ãã¯: list 以å€ãæž¡ãããå Žåã«åããããããšã©ãŒãåºã
+ if not isinstance(preorder, list) or not isinstance(inorder, list):
+ raise TypeError("Both preorder and inorder must be lists")
+
+ # â¡ é·ãäžäžèŽãã§ãã¯: åãæšã§ãªããã°åŸ©å
äžå¯
+ if len(preorder) != len(inorder):
+ raise ValueError(
+ f"Length mismatch: preorder={len(preorder)}, inorder={len(inorder)}"
+ )
+
+ # ⢠空ãªã¹ããã§ãã¯: ããŒã0å â Noneãè¿ã
+ if not preorder:
+ return None
+
+ n = len(inorder)
+
+ # ⣠ååŠç: inorder ã®ãå€âã€ã³ããã¯ã¹ãã dict å
å
衚èšã§ O(n) æ§ç¯
+ # â
æ¯å list.index() ã䜿ããšå
šäœ O(n²) â dict ãªã O(1) ã«ãã¯ã¢ãã
+ inorder_index: dict[int, int] = {val: i for i, val in enumerate(inorder)}
+
+ # †preorder ãå
é ããæ¶è²»ããã«ãŒãœã«
+ # int ã¯ã€ãã¥ãŒã¿ãã«(倿Žäžå¯)ãªã®ã§ nonlocal ã§å€åŽå€æ°ãå
±æãã
+ preorder_idx: int = 0
+
+ def build(lo: int, hi: int) -> Optional[TreeNode]:
+ """inorder ã® [lo, hi] ç¯å²ã«å¯Ÿå¿ããéšåæšãååž°æ§ç¯ãã"""
+ nonlocal preorder_idx
+
+ # ⥠ååž°ã®çµäºæ¡ä»¶: ç¯å²ã空(lo > hi) â éšåæšãªã
+ if lo > hi:
+ return None
+
+ # ⊠preorder ã®çŸåšäœçœ® = ãã®éšåæšã®ã«ãŒãå€
+ # preorder ã¯ãã«ãŒãâå·Šâå³ãé ãªã®ã§åŒã°ããæç¹ã®å
é ãå¿
ãã«ãŒã
+ root_val: int = preorder[preorder_idx]
+ preorder_idx += 1 # 次ã®ååž°ã®ããã«ã«ãŒãœã«ãé²ãã
+
+ # â§ dict ã§ã«ãŒãã® inorder äžã®äœçœ®ã O(1) ã§ååŸ
+ # ãã®äœçœ®(mid)ãå·Šéšåæšãšå³éšåæšã®å¢çç·ã«ãªã
+ mid: int = inorder_index[root_val]
+
+ # âš ããŒããçæãå·Šâå³ã®é ã§ååž°æ§ç¯ããŠæ¥ç¶ãã
+ # â
å·Šãå
ã«ããçç±: preorder ããã«ãŒãâå·Šâå³ãé ã®ãã
+ # å·Šã®ååž°ãçµãããšæ¬¡ã®ã«ãŒãœã«äœçœ®ãå³éšåæšã®ã«ãŒãã«ãªã
+ node = TreeNode(root_val)
+ node.left = build(lo, mid - 1) # å·Šéšåæš(mid ã®å·ŠåŽ)
+ node.right = build(mid + 1, hi) # å³éšåæš(mid ã®å³åŽ)
+ return node
+
+ # â© inorder å
šäœ(0ãn-1)ãå¯Ÿè±¡ã«æšå
šäœãæ§ç¯ããŠè¿ã
+ return build(0, n - 1)
+
+
+
+ â¶ å ¥åäŸ preorder=[3,9,20,15,7] / inorder=[9,3,15,20,7] ã§ã®åäœãã¬ãŒã¹
+ååŠç: inorder_index = {9:0, 3:1, 15:2, 20:3, 7:4}
+preorder_idx = 0
+
+build(0, 4):
+ root_val=3 (preorder[0]), preorder_idxâ1, mid=inorder_index[3]=1
+ node = TreeNode(3)
+ node.left = build(0, 0)
+ root_val=9, preorder_idxâ2, mid=0
+ node.left = build(0,-1) â lo>hi â None
+ node.right = build(1, 0) â lo>hi â None
+ â
return TreeNode(9)
+ node.right = build(2, 4)
+ root_val=20, preorder_idxâ3, mid=3
+ node.left = build(2, 2)
+ root_val=15, preorder_idxâ4, mid=2
+ â TreeNode(15, None, None) â
+ node.right = build(4, 4)
+ root_val=7, preorder_idxâ5, mid=4
+ â TreeNode(7, None, None) â
+ â
return TreeNode(20, left=15, right=7)
+â
return TreeNode(3, left=9, right=20)
+
+æçµããªãŒ:
+ 3
+ / \
+ 9 20
+ / \
+ 15 7
+Output: [3,9,20,null,null,15,7] â
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹
+ð å ¥åäŸ preorder=[3,9,20,15,7] / inorder=[9,3,15,20,7] ã§ã®ãããŒè¿œè·¡
+{9:0,3:1,15:2,20:3,7:4} ã O(n) ã§æ§ç¯
+ ãããŒã®èª¬æïŒ
+ å
¥å£ã®æ€èšŒïŒâ â¡â¢ïŒã§ãšã©ãŒãæ©æçºèŠããdict ååŠçïŒâ¢ïŒã§ O(n²) ã O(n) ã«æ¹åããŸããååž° build(lo,hi) ã§ã¯çµäºæ¡ä»¶ lo>hi ã確èªããåŸãpreorder ã«ãŒãœã«ããã«ãŒããååŸïŒâ€ïŒããdict ã§ã«ãŒãã® inorder äœçœ®ãç¹å®ïŒâ¥ïŒããŠå·Šâå³ã®é ã«ååž°åŒã³åºããè¡ããŸãïŒâŠâ§ïŒãåååž°ã¯å¿
ãåŠç察象ç¯å²ãçž®å°ããããæéåã§çµäºããŸãã
+
ð Big-O èšæ³ã®èªã¿æ¹
+| åŠç | +èšç®é | +çç± | +
|---|---|---|
| inorder_dict æ§ç¯ | +O(n) | +å šèŠçŽ ã1åãã€ç»é² | +
| build ååž°åŒã³åºãåèš | +O(n) | +åããŒããã¡ããã©1åã ãåŠç | +
| inorder_dict[val] 1åããã | +O(1) | +dict ã®å¹³åã«ãã¯ã¢ããã³ã¹ã | +
| åèš | +O(n) | +â | +
| 䜿çšã¡ã¢ãª | +èšç®é | +çç± | +
|---|---|---|
| inorder_dict | +O(n) | +n åã®ããŒã»å€ãã¢ãä¿æ | +
| ååž°ã¹ã¿ã㯠| +O(h) | +h=æšã®é«ãããã©ã³ã¹æš O(log n)ãåãæš O(n) | +
| çæããŒãïŒåºåïŒ | +O(n) | +埩å ããæšå šäœã®ããŒãæ° | +
| åèš | +O(n) | +â | +
| ã¢ãããŒã | +æé | +空é | +åè | +
|---|---|---|---|
| â dictååŠç + ååž°ïŒä»åæ¡çšïŒ | +O(n) | +O(n) | +æéã»ã³ãŒãæç | +
| list.index() + ååž° | +O(n²) | +O(n) | +n=3000 ã§çŽ450äžåæ¯èŒãTLE ãªã¹ã¯ | +
| å埩ïŒã¹ã¿ãã¯ïŒ+ dict | +O(n) | +O(n) | +åéã ãå®è£ ãè€é | +
ð ãªã O(n) ã«ãªãã®ã
+
+ ãã€ã³ã1ïŒdict ã®ååŠçã¯å
šèŠçŽ ã1åèµ°æ»ããã ããªã®ã§ O(n)ã
+ ãã€ã³ã2ïŒååž°é¢æ° build ã¯åããŒãã«å¯ŸããŠã1åã ããåŒã°ããŸããpreorder ã«ãŒãœã«ã¯å調å¢å ïŒ0ân-1ïŒã§ãåå€ãéè€ãªãæ¶è²»ããããã§ãã
+ ãã€ã³ã3ïŒbuild ã®äžã§è¡ã inorder_dict[val] ã¯å¹³å O(1) ãªã®ã§ãåèš n à O(1) = O(n)ã
+ ãŸãšãããš O(n) + O(n) = O(n) ãšãªããŸãã
+
ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãåç §ããŠãã ããã
+list.index() ã䜿ãç¶ãããš ãã®èšç®éã«ãªããŸãã
+ globalïŒã¢ãžã¥ãŒã«å€æ°ïŒãšã¯ç°ãªããçŽè¿ã®å€åŽã¹ã³ãŒãã®ã¿ã察象ãããããªããš += ãæ°ããããŒã«ã«å€æ°ãžã®ä»£å
¥ãšããŠæ±ãããå€åŽãæŽæ°ãããªããã°ãèµ·ããŸãã
+ sys.setrecursionlimit(10_000) ã§äžéãç·©åããå¿
èŠããããŸãã
+ preorder[preorder_idx] ã¯çŸåšåŠçäžã®éšåæšã®ã«ãŒãå€ã§ããããšããæ¡ä»¶ãäžå€æ¡ä»¶ã§ãã
+ + HashMap äºåæ§ç¯ + ååž°åå² ã«ãã O(n) å®è£ +
++ ð¡ ãã®åé¡ãäžèšã§èšããšïŒã2çš®é¡ã®æšã®å·¡åèšé²ïŒInorderã»PostorderïŒãæãããã«ãå ã®äºåæšã®åœ¢ã埩å ããåé¡ã +
++ äºåæšããå·¡åããé çªã®ã«ãŒã«ããè€æ°ãããPostorderã®æ«å°ŸèŠçŽ ã¯å¿ ããã®éšåæšã®ã«ãŒãïŒæ ¹ïŒã«ãªããŸãããã®æ§è³ªãšHashMapãçµã¿åãããããšã§ãé åã³ããŒãªãã«O(n)ã§æšãåæ§ç¯ã§ããŸãã +
+â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã
+list.index() ã§ã«ãŒãäœçœ®ãæ¯åæ¢ããš O(n) à nå ïŒ O(n²) ã«ãªãTLEã«ãªãïŒn=3000ã§æå€§900äžåã®æäœïŒsys.setrecursionlimit ãå¿
é å ¥å
+inorder = [9, 3, 15, 20, 7] +postorder = [9, 15, 7, 20, 3]+
åºåïŒæšã®åœ¢ïŒ
+3 + / \ + 9 20 + / \ + 15 7+
+ ãªããããæ£è§£ãïŒ
+ postorderã®æ«å°Ÿ3ãã«ãŒã â inorderã§3ã®å·Šã[9]ïŒå·ŠéšåæšïŒãå³ã[15,20,7]ïŒå³éšåæšïŒãšç¹å®ã§ããããã®æäœãååž°çã«ç¹°ãè¿ãããšã§æšå
šäœã埩å
ã§ããã
+
â¶ Play ãã¿ã³ã§èªååçãPrev/Next ã§æåæäœã§ããŸãã
+ +ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ
+sys.setrecursionlimit(10_000) ãèšå®idx_map = {v: i for i, v in enumerate(inorder)} ã§ O(1) æ€çŽ¢ãå¯èœã«ããpost_idx = [len(postorder) - 1] ã§æ«å°Ÿããã«ãŒããæ¶è²»ããã«ãŒãœã«ãèšçœ®import sys
+from typing import Optional, List
+
+class Solution:
+ def buildTree(
+ self,
+ inorder: List[int],
+ postorder: List[int]
+ ) -> Optional[TreeNode]:
+ # Python ã®ããã©ã«ãååž°äžé㯠1000ã
+ # å®å
šåãæšã§ã¯ n=3000 段ã®ååž°ãå¿
èŠã«ãªãããäžéãåŒãäžããã
+ sys.setrecursionlimit(10_000)
+
+ # dict å
å
衚èšã§ãå€ â inorder ã®ã€ã³ããã¯ã¹ãã O(n) ã§1åã ãæ§ç¯ã
+ # list.index() ãæ¯ååŒã¶ãš O(n²) ã«ãªããããäºåæ§ç¯ã§ O(1) æ€çŽ¢ãå®çŸã
+ idx_map: dict[int, int] = {v: i for i, v in enumerate(inorder)}
+
+ # post_idx ããªã¹ãã§å
ãæ
£çšå¥ã
+ # å
åŽé¢æ°ããå€åŽã® int ãæžãæããã«ã¯ nonlocal ãå¿
èŠã ãã
+ # ãªã¹ãã«å
ãããšã§ããªã¹ãã®äžèº«ãå€ãããæäœã«ãªã nonlocal äžèŠã«ãªãã
+ post_idx: List[int] = [len(postorder) - 1]
+
+ def dfs(left: int, right: int) -> Optional[TreeNode]:
+ # çµäºæ¡ä»¶ïŒå·Šç«¯ãå³ç«¯ãè¶
ãã = ãã®ç¯å²ã«èŠçŽ ããªã = éšåæšãªã
+ if left > right:
+ return None
+
+ # postorder ã®æ«å°ŸããçŸåšã®éšåæšã®ã«ãŒããåãåºãã
+ # list ã®ã€ã³ããã¯ã¹ã¢ã¯ã»ã¹ã¯ O(1)ãã«ãŒãœã«ã1ã€åã«é²ããã
+ val: int = postorder[post_idx[0]]
+ post_idx[0] -= 1
+
+ # ã«ãŒãããŒããäœæããã
+ node = TreeNode(val)
+
+ # dict ãã O(1) ã§ã«ãŒãã® inorder äžã®äœçœ®ãååŸããã
+ # ãã®äœçœ®ãããå·ŠåŽããå·Šéšåæšããå³åŽããå³éšåæšã«ãªãã
+ mid: int = idx_map[val]
+
+ # â
éèŠâ
å³éšåæšãå
ã«ååž°ããçç±ïŒ
+ # postorder ãæ«å°Ÿããéé ã«æ¶è²»ãããšãã«ãŒãâå³âå·Šãã®é ã«ãªãã
+ # ã€ãŸã次㮠pop ã¯ãå³éšåæšã®ã«ãŒãããæããŠããã
+ # å·Šãå
ã«ãããšæ¶è²»é åºããããŠèª€ã£ãæšã«ãªã£ãŠããŸãã
+ node.right = dfs(mid + 1, right) # å³ïŒmid+1 ã right
+ node.left = dfs(left, mid - 1) # å·ŠïŒleft ã mid-1
+
+ return node
+
+ # inorder ã®å
šç¯å²ïŒ0 ã n-1ïŒãå¯Ÿè±¡ã«æšãæ§ç¯ããŠè¿ã
+ return dfs(0, len(inorder) - 1)
+
+ â¶ å
¥åäŸ inorder=[9,3,15,20,7], postorder=[9,15,7,20,3] ã§ã®åäœãã¬ãŒã¹
äºåæºå:
+ idx_map = { 9:0, 3:1, 15:2, 20:3, 7:4 }
+ post_idx = [4] â postorder ã®æ«å°Ÿã€ã³ããã¯ã¹
+
+dfs(0, 4) â inorder å
šäœã®ç¯å²
+ val = postorder[4] = 3 post_idx: [4]â[3]
+ mid = idx_map[3] = 1
+ node = TreeNode(3)
+ ââ node.right = dfs(2, 4)
+ â val = postorder[3] = 20 post_idx: [3]â[2]
+ â mid = idx_map[20] = 3
+ â node = TreeNode(20)
+ â ââ node.right = dfs(4, 4)
+ â â val = postorder[2] = 7 post_idx: [2]â[1]
+ â â node = TreeNode(7) â èããŒãïŒå·Šå³NoneïŒ
+ â â return TreeNode(7) â
+ â ââ node.left = dfs(2, 2)
+ â val = postorder[1] = 15 post_idx: [1]â[0]
+ â node = TreeNode(15) â èããŒã
+ â return TreeNode(15) â
+ â return TreeNode(20) â
+ ââ node.left = dfs(0, 0)
+ val = postorder[0] = 9 post_idx: [0]â[-1]
+ node = TreeNode(9) â èããŒã
+ return TreeNode(9) â
+
+æçµçµæ:
+ 3
+ / \
+ 9 20
+ / \
+ 15 7 â
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹
+ð å
¥åäŸ inorder=[9,3,15,20,7], postorder=[9,15,7,20,3] ã§ã®ãããŒè¿œè·¡
{9:0, 3:1, 15:2, 20:3, 7:4} ã O(n)ã§çæpost_idx=[4]ïŒæ«å°Ÿã€ã³ããã¯ã¹ïŒval=postorder[4]=3ãpost_idx=[3]node=TreeNode(3)ãmid=idx_map[3]=1dfs(2, 4) ã§ã«ãŒã20ã®éšåæšãæ§ç¯dfs(0, 0) ã§ã«ãŒã9ã®èããŒããæ§ç¯â¡ ãªããå³ãå ã«ååž°ãããã®ãïŒ
+Postorderã¯ãå·Šâå³âèªåãã®é ãªã®ã§ãæ«å°Ÿããéé ã«åãåºããšãèªåâå³âå·Šãã®é ã«ãªããŸããpost_idxã®ã«ãŒãœã«ãé²ããçŽåŸã«æ¥ãæ¬¡ã®æ«å°ŸèŠçŽ ã¯åžžã«ãå³éšåæšã®ã«ãŒããã§ããå·Šãå ã«ååž°ããŠããŸããšã«ãŒãœã«ãããã誀ã£ãããŒããã«ãŒãã«ããŠããŸããŸãã
+ð Big-O èšæ³ã®èªã¿æ¹ïŒå ¥åãµã€ãº n ã倧ãããªãã«ã€ããŠåŠçæéãã©ãå¢ãããã®ç®å®ïŒ
+| çš®å¥ | +èšç®é | +å èš³ | +
|---|---|---|
| æéèšç®é | +O(n) | +idx_map æ§ç¯ O(n) + åããŒãã1åã ãåŠç O(n) = O(n) | +
| 空éèšç®é | +O(n) | +idx_map O(n) + ååž°ã¹ã¿ã㯠O(h)ïŒh=æšã®é«ããææª O(n)ïŒ+ åºåããŒã O(n) | +
| â ïž æ¯èŒïŒãã€ãŒãç | +O(n²) | +list.index() ãæ¯ååŒã¶ãš O(n) à nå = O(n²)ãn=3000ã§æå€§900äžæäœã |
+
ð ãªããã®èšç®éã«ãªãã®ã
+
+ æéO(n)ã®çç±ïŒidx_mapã®æ§ç¯ã¯enumerate()ã§1åã ãèµ°æ»ããã®ã§O(n)ãdfs()ã¯nåã®ããŒãããããã1åã ãåŠçããååŠçå
ã®dictæ€çŽ¢ãšpop()ã¯O(1)ãªã®ã§åèšO(n)ãå
šäœã§O(n)+O(n)=O(n)ã
+
+ 空éO(n)ã®çç±ïŒidx_mapã«nåã®ãšã³ããªãæ ŒçŽããã®ã§O(n)ãååž°ã¹ã¿ãã¯ã¯æšã®é«ãhåã ãç©ãŸããããå®å
šã«åã£ãæšã§ã¯ h=n ã«ãªãã®ã§ææªO(n)ãåºåã®æšãnåã®ããŒããäœæããã®ã§O(n)ã
+
ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ããã
+idx_map = {v: i for i, v in enumerate(inorder)} ã§
+ ãå€ â inorderã§ã®äœçœ®çªå·ããèšé²ããã«ãŒãã®äœçœ®ã O(n)âO(1)ã«ççž®ããŠããã
+ if left > right: return None ãããã«ãããã
+ sys.setrecursionlimit(10_000) ã§äžéãåŒãäžããŠå¯ŸåŠããã
+ {k: v for ...} ã®åœ¢ã§ dict ã1è¡ã§äœã Python ã®æžãæ¹ã
+ éåžžã® for ã«ãŒããã CPythonïŒïŒæãåºã䜿ããã Python ã®å®è£
ïŒå
éšã§æé©åãããåœä»€ã䜿ãããé«éã
+ {v: i for i, v in enumerate(inorder)} ã¯
+ ãinorder ã®å€ â ãã®ã€ã³ããã¯ã¹ãã O(n) ã§äžæ¬æ§ç¯ããã
+ list.index() ãæ¯ååŒã¶ãã€ãŒããªå®è£
㯠O(n²) ã«ãªãã
+ n=3000 ã§æå€§900äžåã®æäœãå¿
èŠã«ãªããã TLE ã«ãªãå¯èœæ§ãããã
+ left == right ã«ãªããšèããŒããäœãããã
+ + ããã ã¢ããDFSïŒçªå µå€-1ïŒã«ãã O(n) å®è£ +
++ ð¡ + ãã®åé¡ãäžèšã§èšããšïŒãæšã®ãã¹ãŠã®ããŒãã§ãå·Šå³ã®æã®æ·±ãã®å·®ã1以å ãã©ãããå€å®ããåé¡ã +
++ é«ãåè¡¡äºåæšïŒheight-balanced binary + treeïŒãšã¯ãå šããŒãã§å·Šå³ã®éšåæšã®é«ãã®å·®ãæå€§1ã§ãããããªäºåæšã§ãã + ç©ºã®æšïŒroot = nullïŒãé«ãåè¡¡ãšããŠæ±ããŸãã +
++ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
++ 3 + / \ + 9 20 + / \ + 15 7+
+ å šããŒãã§å·Šå³ã®é«ãã®å·® †1 â + true +
++ 1 + / \ + 2 2 + / \ + 3 3 +/ \ +4 4+
+ ã«ãŒãã®å·Šå³ã®é«ãå·® = 2 â + false +
++ïŒç©ºã®æšïŒ +root = null+
+ ç©ºã®æšã¯å®çŸ©äž åè¡¡ â + true +
++ ð§ è§£æ³ã®ã¢ã€ãã¢ïŒ1ãã¹ã§é«ãèšç®ãšåè¡¡ãã§ãã¯ãåæã«è¡ã +
++ èããŒãïŒåã®ãªãããŒãïŒããæ ¹ããŒãã«åãã£ãŠããã®ãŒããªããïŒããã ã¢ããïŒãé«ããè¿ãã€ã€åæã«åè¡¡ãã§ãã¯ãè¡ããŸãã + äžåè¡¡ãèŠã€ãã£ãã + -1ïŒçªå µå€ïŒãè¿ããäžäœããŒããžäŒæãããŸãã + ããã«ããåããŒããã¡ããã©1åã ã蚪åãã O(n) ãå®çŸã§ããŸãã +
++ åã¹ããããã¯ãªãã¯ããã â¶ Play ã§èªååçã§ããŸãã +
+ ++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+from typing import Optional
+
+class Solution:
+ def isBalanced(self, root: Optional[TreeNode]) -> bool:
+
+ def check_height(node: Optional[TreeNode]) -> int:
+ # ããŒã¹ã±ãŒã¹ïŒç©ºã®ããŒãã¯é«ã0
+ # `is None` ã¯PEP 8æšå¥šãNone ã¯ã·ã³ã°ã«ãã³ãªã®ã§ is ãæ£ç¢º
+ if node is None:
+ return 0
+
+ # å·ŠãµãããªãŒã®é«ããååž°ã§ååŸ
+ left_height = check_height(node.left)
+ # å·Šã -1ïŒäžåè¡¡æ€ç¥æžã¿ïŒãªãå³åº§ã« -1 ãè¿ãïŒæ©æãªã¿ãŒã³ïŒ
+ if left_height == -1:
+ return -1
+
+ # å³ãµãããªãŒã®é«ããååž°ã§ååŸ
+ right_height = check_height(node.right)
+ # å³ã -1 ã®ãšããåæ§ã«äŒæ
+ if right_height == -1:
+ return -1
+
+ # ãã®ããŒãã§ã®åè¡¡ãã§ãã¯
+ # abs() ã¯Cå®è£
ã®çµã¿èŸŒã¿é¢æ°ã§é«é
+ if abs(left_height - right_height) > 1:
+ return -1 # çªå
µå€ -1 ãè¿ããŠäžåè¡¡ãäžäœãžç¥ããã
+
+ # ãã®ããŒãã®é«ã = max(å·Š, å³) + èªåã®1
+ # max() ãCå®è£
ã®çµã¿èŸŒã¿é¢æ°ã§é«é
+ return max(left_height, right_height) + 1
+
+ # check_height ã -1 ã§ãªããã°åè¡¡ããŠãã
+ return check_height(root) != -1
+
+ + â¶ å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®åäœãã¬ãŒã¹ +
++check_height(3) éå§ + ââ check_height(9) â left=0, right=0, diff=0 †1 â return 1 + â left_height=1 (â -1ãç¶ç¶) + ââ check_height(20) éå§ + â ââ check_height(15) â return 1 + â â left_height=1 (â -1ãç¶ç¶) + â ââ check_height(7) â return 1 + â â right_height=1 (â -1ãç¶ç¶) + â ââ abs(1-1)=0 †1 â return max(1,1)+1 = 2 + â right_height=2 (â -1ãç¶ç¶) + ââ abs(1-2)=1 †1 â return max(1,2)+1 = 3 + +check_height(root) = 3 +3 != -1 â isBalanced = True â+
+ â¶ äžåè¡¡ã±ãŒã¹ [1,2,2,3,3,null,null,4,4] ã§ã®åäœãã¬ãŒã¹ +
++check_height(4) â 1 (å·Šã®4) +check_height(4) â 1 (å³ã®4) +check_height(3) [å·Š] â abs(1-1)=0 â return 2 +check_height(3) [å³] â abs(0-0)=0 â return 1 +check_height(2) [å·Š] â abs(2-1)=1 †1 â return 3 +check_height(2) [å³] â return 1 +check_height(1) [ã«ãŒã] + left_height=3, right_height=1 + abs(3-1) = 2 > 1 â return -1 â äžåè¡¡ïŒ + +check_height(root) = -1 +-1 == -1 â isBalanced = False â+
+ ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ [3,9,20,null,null,15,7] ã§ã®ãããŒè¿œè·¡ +
++ ð Big-O èšæ³ã®èªã¿æ¹ïŒn = + ããŒãæ°ã倧ãããªãã«ã€ããŠåŠçæéãã©ãå¢ãããã®ç®å®ïŒ +
+| + ã¢ãããŒã + | ++ æéèšç®é + | ++ 空éèšç®é + | ++ åè + | +
|---|---|---|---|
| + â ããã ã¢ããDFSïŒçªå µå€-1ïŒ + | ++ O(n) + | ++ O(h) + | ++ åããŒãã1åã ã蚪åãh=æšã®é«ãïŒåè¡¡æšã§ã¯O(log + n)ãææªO(n)ïŒ + | +
| + â ãããããŠã³ååž°ïŒçŽ æŽïŒ + | ++ O(n²) + | ++ O(h) + | ++ é«ãèšç®ãšåè¡¡ãã§ãã¯ãåé¢ããããåãããŒããç¹°ãè¿ã蚪åããŠããŸã + | +
| + BFSïŒå¹ åªå æ¢çŽ¢ïŒ + | ++ O(n) + | ++ O(n) + | ++ dequeã®ã¡ã¢ãªç¢ºä¿ã³ã¹ãããããå®è£ ãè€éã«ãªãããã + | +
+ ð ãªããã®èšç®éã«ãªãã®ã +
+
+ æéèšç®é O(n)ïŒcheck_height
+ ã¯ãã¹ãŠã®ããŒããã¡ããã©1åã ã蚪åããŸããäžåè¡¡ãèŠã€ãã£ãç¬éã« -1
+ ãè¿ãæ©æãªã¿ãŒã³ã«ãããç¡é§ãªååž°åŒã³åºããçããŠããŸãã
+ 空éèšç®é O(h)ïŒååž°åŒã³åºãã®ã³ãŒã«ã¹ã¿ãã¯ãæšã®é«ã h
+ åã ãç©ã¿éãªããŸããåè¡¡æšã§ã¯ h = O(log n)ãææªã®äžçŽç·ã®æšã§ã¯ h = O(n)
+ ã«ãªããŸãã
+
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ããã +
+node is None
+ ãããŒã¹ã±ãŒã¹ã§ãé«ã0ãè¿ããŸãã
+ return
+ ããŠåŠçãçµããææ³ã§ããäžåè¡¡ã確å®ããæç¹ã§å³ãµãããªãŒã調ã¹ãå¿
èŠããªããªããããç¡é§ãªèšç®ãçããŸãã
+ NoneãTrueãFalse
+ ãããã«ããããŸããis None
+ ã
+ == None
+ ããæ£ç¢ºã§éãçç±ã¯ãNoneãã·ã³ã°ã«ãã³ã ããã§ãã
+ + å埩ã¹ã¿ãã¯ïŒæç€ºã¹ã¿ãã¯ïŒã«ãã O(N) äžé èµ°æ» +
+ +
+ äºåæšã®æ ¹ããŒã
+ root ãäžããããã
+ äžé èµ°æ»ïŒå·Šâæ ¹âå³ïŒ
+ ã§ããŒãã®å€ãåéãããªã¹ããšããŠè¿ãã
+ Follow-up:
+ ååž°ã䜿ããªãå埩解ãå®è£
ããã
+
+ Input: root = [1, null, 2, 3]
+ Output: [1, 3, 2]
+
from __future__ import annotations
+from typing import Optional
+
+
+# Definition for a binary tree node.
+class TreeNode:
+ def __init__(
+ self,
+ val: int = 0,
+ left: Optional["TreeNode"] = None,
+ right: Optional["TreeNode"] = None,
+ ) -> None:
+ self.val = val
+ self.left = left
+ self.right = right
+
+
+class Solution:
+ """
+ LeetCode 94 - Binary Tree Inorder Traversal
+ äžé èµ°æ»ïŒå·Šâæ ¹âå³ïŒãæç€ºã¹ã¿ãã¯ã«ããå埩ã§å®è£
ã
+
+ Time: O(N) - å
šããŒããäžåºŠã ã蚪å
+ Space: O(N) - æç€ºã¹ã¿ãã¯ã®æå€§æ·±ãïŒææª: å·Šåæšã§ NïŒ
+ """
+
+ def inorderTraversal(self, root: Optional[TreeNode]) -> list[int]:
+ # ââ ã¬ãŒã: 空æšã¯å³åº§ã«ç©ºãªã¹ããè¿ã
+ if root is None:
+ return []
+
+ result: list[int] = [] # äžé èµ°æ»ã®çµæ
+ stack: list[TreeNode] = [] # æç€ºã¹ã¿ãã¯ïŒé None ã®ã¿æ ŒçŽïŒ
+ cur: Optional[TreeNode] = root # çŸåšæ³šç®ããŠããããŒã
+
+ while cur is not None or stack:
+
+ # Ph1: 巊端ãŸã§æœããªããã¹ã¿ãã¯ã«ç©ã
+ while cur is not None:
+ stack.append(cur) # å³ã»èªèº«ã¯åŸåã
+ cur = cur.left # å·Šãžé²ã
+
+ # Ph2: ã¹ã¿ã㯠top ãåãåºããŠèšªå
+ node: TreeNode = stack.pop()
+ result.append(node.val) # â äžé ã§å€ãèšé²
+
+ # Ph3: å³éšåæšãžã«ãŒãœã«ãç§»ã
+ cur = node.right # None ãªã次ã«ãŒãã§å³ Ph2 ãž
+
+ return result
+
+ ãããŒã®èª¬æïŒ
+ 1. åæå: resultã»stackã»curãåæèšå®ããã
+ 2. ã«ãŒãæ¡ä»¶:
+ curãéNoneãŸãã¯stackã空ã§ãªãéã3ãã§ãŒãºãç¹°ãè¿ãã
+ 3. Ph1ïŒç·ïŒ:
+ curãéNoneã®éã巊端ãŸã§æœããªããã¹ã¿ãã¯ã«ç©ãïŒã«ãŒãããã¯ïŒçŽ«ç¢å°ïŒã
+ 4. Ph2ïŒéïŒ: ã¹ã¿ãã¯ããpopããval
+ ãçµæãªã¹ãã«äžé ã§èšé²ããã
+ 5. Ph3ïŒçŽ«ïŒ: cur = node.right
+ ã«ç§»åããã«ãŒãæ¡ä»¶ãžæ»ãïŒçŽ«ç¢å°ïŒã
+ 6. çµäºïŒèµ€ïŒ: curãšstackãå
±ã«ç©ºã«ãªã£ããçµæãè¿ãã
+
+ å šããŒããã¹ã¿ãã¯ã« push 1åã»pop 1åã®åèš 2N æäœã宿°åãç¡èŠãããš + O(N)ã +
++ æç€ºã¹ã¿ãã¯ã®æå€§æ·±ããææªã±ãŒã¹ã¯ N + ããŒããå šãŠå·Šã«åã£ãæšïŒã¹ã¿ãã¯æ·±ã = NïŒã +
+| + ã¢ãããŒã + | ++ æé + | ++ 空é + | ++ å¯èªæ§ + | ++ å®å šæ§ + | +
|---|---|---|---|---|
| + â ååŸ©ïŒæç€ºã¹ã¿ãã¯ïŒ + | +O(N) | +O(N) | +â â â | ++ â + | +
| + ååž° DFS + | +O(N) | +O(N) | +â â â | ++ â³ â» + | +
| + Morris Traversal + | +O(N) | +O(1) | +â ââ | ++ â³ å¯äœçš + | +
+ â» Python ããã©ã«ãååž°äžé 1,000 ã§ã¹ã¿ãã¯ãªãŒããŒãããŒãªã¹ã¯ãã +
+173 interactive lessons across 6 domains
+175 interactive lessons across 6 domains