# **Leetcode筆記(Invert Binary Tree)** :::info :information_source: 題目 : Invert Binary Tree, 類型 : binary tree , 等級 : easy 日期 : 2023/03/18,2023/05/02,2023/07/03,2023/10/03,2025/02/20 ::: ### 嘗試 原本想用deque分左右邊,最後算是有自己做出來,時間複雜度O(n),空間複雜度O(1) ```python class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: q = deque([root]) temp = TreeNode() while q: if node.left: q.appendleft(node.left) if node.right: q.append(node.right) for i in range( len(q) // 2 ): rightnode = q.popleft() leftnode = q.pop() ``` ```python class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: if not root: return None root.left, root.right = root.right, root.left self.invertTree(root.left) self.invertTree(root.right) return root ``` 2023/05/02 ```python class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: if not root: return self.switch(root) return root def switch(self, node): if not node: return temp = TreeNode() # 交換 temp = node.left node.left = node.right node.right = temp # 傳遞 # 即使是在switch裡面呼叫switch,也需要self self.switch(node.right) self.switch(node.left) ``` 2023/07/03 目前對於遞歸的想法是 : 先從最尾端(也就是leaf)開始思考,然後忽略遞歸呼叫的那幾行,只關注它的上方與下方,上代表待操作的東西,可能是要做某些操作(或是單純return),反正做完就依照遞歸下方的區域return參數 ```python class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: if not root: return root.right, root.left = root.left, root.right self.invertTree(root.right) self.invertTree(root.left) return root ``` 2023/10/03 ```python class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: if not root: return root.left, root.right = root.right, root.left self.invertTree(root.left) self.invertTree(root.right) return root ``` 2025/02/20 ```python class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: if not root: return None self.inverse(root) return root def inverse(self, node): if not node: return if node.left or node.right: node.left, node.right = node.right, node.left self.inverse(node.left) self.inverse(node.right) return ``` --- ### **優化** 但其實用觀察可以得到,把各左右小孩翻轉一次,連續翻轉到上面,就可以得到完整內容。 時間複雜度O(n),空間複雜度O(n) ```python class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: if not root: return None # swap temp = root.right root.right = root.left root.left = temp self.invertTree(root.left) self.invertTree(root.right) return root ``` --- **:warning: 錯誤語法** :::warning 'NoneType' object has no attribute 'right' 可能是因為該treenode為null ::: **:thumbsup:學習** :::success 若只寫return,後面沒接東西,类似循环里的break,只是为了不再继续执行下面的语句 ::: **思路** **講解連結** https://www.youtube.com/watch?v=OnSn2XEQ4MY Provided by. NeetCode ###### tags: `binary tree` `easy` `leetcode`